JDK
JDK(Java Development Kit) 是 Java 语言的 软件开发工具包 (SDK)。其结构图为
JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
①SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。
②EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。
③ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。
JDK安装目录下
bin(binary ):各种可运行字节码,在windows为可执行的.exe文件,启用jdk功能的文件.主要的一个编译器(javac.exe)
include:java和JVM交互用的头文件
lib(libarary):类库
jre:java运行环境
JRE
JRE(Java Runtime Environment),是运行基于Java语言编写的程序所不可缺少的 运行环境 。
包括两部分:
Java Runtime Environment和Java Plug-in。JRE是可以在其上运行、测试和传输应用程序的Java平台。
它包括Java虚拟机(jvm)、Java核心类库和支持文件,它不包含开发工具(JDK)--编译器、调试器和其它工具。
JRE需要辅助软件--Java Plug-in--以便在浏览器中运行applet。
JRE自带的基础类库主要是JRE\lib\rt.jar这个文件,包括了Java2平台标准版的所有类库。和JRE的版本一致。
JVM
JVM(Java Virtual Machine),Java虚拟机的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。
-------------
每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私有的栈。进程所创建的所有类的实例(也就是对象)或数组(指的是数组的本身,不是引用)都放在堆中,并由该进程所有的线程共享;栈中只保存基础数据类型本身和自定义对象的引用。
大多数 JVM 将内存区域划分为
Method Area(Non-Heap)(方法区,也叫静态区),
Heap(堆),
Program Counter Register(程序计数器),
VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),
Native Method Stack (本地方法栈).
其中 Method Area 和 Heap 是线程共享的,VMStack,Native Method Stack 和 Program Counter Register是非线程共享的。
JVM初始运行的时候都会分配好Method Area(方法区)和Heap(堆),而JVM 每遇到一个线程,就为其分配一个Program Counter Register(程序计数器), VM Stack(虚拟机栈)和Native Method Stack (本地方法栈),当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因。