一、JDK的原理
1、JDK与Java SE/EE/ME的区别
1)Java SE(Java Platform,Standard Edition)
Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。
Java SE 是做电脑上运行的软件。
2) Java EE(Java Platform,Enterprise Edition)
这个版本以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。
Java EE 是用来做网站的(我们常见的JSP技术)。
3)Java ME(Java Platform,Micro Edition)
这个版本以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。
Java ME 是做手机软件的。
在一台电脑上可以同时安装Java SE、Java EE、Java ME,不影响,对应开发需求不一样,用对应的版本。
JDK与Java SE/EE/ME的区别
jdk是不区分se、ee、me的,所以你在oracle的官网上只要下载java se对应的版本jdk即可:
2、Tomcat、JAVA、JDK、JRE、JVM、JSP概念的区别
JDK (Java Development Kit) ,是 Java 语言的软件开发工具包(SDK)),JDK是整个java开发的核心,它包含了JAVA运行时环境Java Runtime Enviromental,JRE)和 JAVA工具,其中JRE包括(JVM+Java系统类和库);
JAVA虚拟机(Java Virtual Mechinal,JVM),JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
JAVA开发人员通过JDK(调用JAVA API)工具包,开发了JAVA程序(JAVA源码文件)之后,通过JDK中的编译程序(JAVAC)将java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。
-
JRE :JAVA运行时的环境,主要用于运行JAVA程序、代码,JRE(JVM+JAVA类和库);
-
Tomcat :是基于JAVA语言开发JAVA程序,WEB容器(服务器);
-
java :是主流开发语言,跟PHP、ASP、HTML类似网站设计语言;
二、JVM虚拟机详解
JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用,如图所示JDK、JRE、JVM关系图:
如下为JVM虚拟机主要由堆、栈、本地方法栈、方法区组成,物理架构如图:
1、堆
所有通过new创建的对象的内存都在堆中分配,堆的大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示:
- 新生代,新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例
- 旧生代,用于存放新生代中经过多次垃圾回收仍然存活的对象
- 持久带,(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没有Permanent Space而用其他机制来实现方法区。
-Xmx:最大堆内存,如:-Xmx512m;
-Xms:初始时堆内存,如:-Xms256m;
-XX:MaxNewSize:最大年轻区内存;
-XX:NewSize:初始时年轻区内存.通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90%;
-XX:MaxPermSize:最大持久带内存;
-XX:PermSize:初始时持久带内存;
-XX:+PrintGCDetails。打印 GC 信息;
-XX:NewRatio 新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3;
-XX:SurvivorRatio 新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10。
2、栈
每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。
-xss:设置每个线程的堆栈大小. JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。
3)本地方法栈
用于支持native方法的执行,存储了每个native方法调用的状态
4)方法区
存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。