“温故而知新”,对于JDK、JRE和JVM之间的关系可能学了或者说看了不知道多少遍了,但记忆总是不深刻,通过这次总结希望自己能有一个更好的认知。
先来看一下这张图片,其实这张图片包含了所有的内容,只是我们看起来有时候不是那么的直观,下面我们再对JDK、JRE和JVM做一个单独的介绍。
一、JDK
JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品。
JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac(编译)/jar(打包)/java/jdb等)和Java基础的类库(即Java API包括rt.jar,rt.jar可以简单粗暴地理解为:它就是java源码编译成的jar包,也就是我们在java doc里面看到的所有的类的class文件(可以解压出来看一下))。
JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是JVM,lib中则是JVM工作所需要的类库,而JVM(bin)和 lib和起来就称为JRE。
二、JRE
JRE是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。
JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。
与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。
三、JVM(关于JVM更为详细的内容可以参考对于JVM的重新认知)
JVM就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
四、JDK和JRE区别
去bin文件夹下你会发现,JDK有javac.exe而JRE里面没有,众所周知javac指令是用来将java文件编译成class文件的,这是你开发去做的事,用户是不会去做的。JDK还有jar.exe, javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。
五、JRE和JVM区别
有些人觉得,JVM就可以执行class了,其实不然,JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。
六、三者之间的关系
对于初学者来说,可以简单的理解为就是JDK包含JRE,JRE又包含JVM的关系。