JDK JRE JVM HotSpot 之间的区别和联系

缘起

学java伊始的时候就经常听说这四个单词,但是具体什么意思,他们之间的联系是什么,当时就是不求甚解了. 现在回顾,有必要好好整理一下,不要到头来搞了一辈子java,连这四个单词的区别和联系都搞不清楚就丢人了.

分析

首先说个简单点的. jvm,顾名思义就是虚拟机,但是JVM本质上讲,只是一套规范,规定任何解释执行class文件(字节码文件). 而这套规范有多种实现非方案,Hotspot就是JVM规范的实现方案之一(当然,还有oracle的JRockit),他是sun开发的、是sun jdk和openjdk中自带的虚拟机. 同时也是使用最广泛的JVM实现方案.

Hotspot,顾名思义就是它是基于热点探测的,即有JIT(just in time)即时编译功能,能提供更高质量的本地代码。

总体而言,JVM和Hotspot,一个是接口,一个是实现.

下面简称Hotspot等实现方案为jvm哈~

jvm是java实现跨平台最核心的部分. 所有java程序会首先被编译成class文件,这种文件在虚拟机上执行,而不是直接和底层os打交道. 虚拟机和底层打交道,经过虚拟机解释给os听,让os执行.

jvm是整个java平台的基石,和一般的底层os一样,它也有自己的指令集,并且在运行时操纵不同的内存区域. jvm通过抽象os和cpu,提供了与平台无关的代码执行方法, 即与特定的硬件、特定的os无关,但是一些小的方面——如gc算法、线程调度算法,可能对不同的os有不同的实现.

那,有了jvm就能解释执行class文件了么? 非也~ 因为在解释class的时候jvm需要调用解释需要的类库lib. 你在JDK的安装目录中就可以找到jre目录(其实一般安装jdk的时候可以选择不装jdk,只安装jre, D:\JDK\jdk8\jre下的内容和下图一模一样,就是多了一个release文件)。里面有两个目录一个是jre和lib

这里,你可以把bin目录理解为jvm. 里面是一堆的exe和dll文件(包括java.exe、javaw.exe). 而lib则就是jvm工作时调用解释需要的类库. 里面是一堆的jar文件. 如 rt.jar、jce.jar、jsse.jar、charsets.jar 等基础的jar包.

jvm(就是上面的bin)和lib合起来就是jre(java runtime environment). 所以在你编写完java程序编译为class文件之后和jre一起打包给你的朋友,你的朋友就可以运行你写的程序了(jre的bin目录下就有运行class文件的java.exe文件).

所以 JRE是jvm+lib,换言之,jre包含jvm

jre的地位就像一台PC机,我们写好的win32程序需要os帮我们运行,同样的,我们编写的class文件也需要jre帮我们解释执行.

然后有JRE就行了么? 非也,jre是解释执行class文件的,但是class文件从哪里来呢? 当然是我们java程序员编写完java源文件之后通过编译器编译出来的呀~ 这就需要JDK(java development kit,java开发工具包)登场了.

我们来看看jdk里面包含哪些东西

  • src.zip 源码压缩包

  • 一些声明文件

  • bin

    里面最主要的就是编译器 javac.exe

  • include

    java和JVM交互用的头文件, 一堆的c/c++的 header文件,例如著名的 jni.h

  • jre

    就是上面提到的java运行时环境.

  • lib

    一些jar包

注意,这里的bin和lib和上面提到的jre中的bin、lib里面的内容是不一样的.总体来讲,jdk就是到编译出class文件为止了,但是要运行这些class文件就需要依赖jre了.jre只有运行class文件的功能而没有编译出class文件的功能.

但是我们注意到jdk目录下包含jre目录,所以作为java程序员的我们完全可以不额外安装jre(就是D:\JDK\jdk8\jdk下面已经有jre目录了,我们不需要额外安装jre到D:\JDK\jdk8\jre目录中去, 当然,初学者的我们都会装的)

所以,JDK包含了JRE,JRE包含了JVM

最后,eclipse、idea等IDE工具自带自己的java编译器而不是用jdk下的bin中的javac.exe进行编译. 比如eclipse内置的Java编译器是ECJ,甚至tomcat也是用ecj进行jsp编译的.

所以这些IDE工具只需要你提供jre路径.