JDK、JRE、JVM之间的关系
JDK、JRE、JVM之间的关系:
首先看看JDK与JRE的区别,如下图所示:
JKD1.4版本与JDK1.3版本会有一点点不同:
从上图知,如果您安装了JDK,那么你的电脑地下一定会有两套JRE、一套位于<jdk安装目录>\jre底下,另一套位于C:\Program File\JavaSoft底下(JDK1.4则是放在C:\Program File\Java底下)。如果你只下载了JRE而非JDK,那么就只会在C:\Program File\JavaSoft底下安装唯一的一套JRE。
那么JRE的作用是什么?如图JRE和PC的类比:
由图可知JRE的地位就像一台PC一样,WIN32程序需要作业系统来帮我们执行,同样,Java应用程序需要JRE才能帮我们执行。当安装完JDK之后,如果分别在硬盘的不同地方安装了两套JRE,那么你可以想象你的电脑有两台虚拟的Java PC,都具有执行Java程序的功能。所以Java虚拟机只是JRE其中的一个成员而已,以更技术的角度来看,Java虚拟机只是JRE里头的一个动态连结函数库。
那么为什么会有两套JRE?真正原因是-JDK里面也附上了很多用Java写的开发工具(例如javac.exe、jar.exe等),而且它们都放置在<jdk安装目录\lib\tools.jar>之中。有人会问用Java编写的应用程序不是.class才对吗?其实在命令提示符中输入javac.exe和输入java -classpath
d:\j2sdk1.4.0\lib\tools.jar com.sun.tools.javac.Main会得到相同的结果,javac.exe只是一个包装器而已。JDK还有很多开发工具采用包装器的概念,在<jdk安装目录\bin>中可以看到。
JDK里面的工具几乎都是用Java所撰写的,所以JDK本身就是Java应用程序,因此要使用JDK附的工具来开发Java程序,也必需要自行附一套JRE才行,这就是<jdk安装目录>\jre底下需要一套JRE的原因。而位于Program File\底下那套JRE就是哪来执行我们自己撰写的Java应用程序。不过,两套JRE都可以用来执行我们自己写的程序,可以JDK内附的开发工具预设置使用包装器启动的情况下,都会自己去选择用<jdk安装目录>\jre底下的那套JRE。
这样又有新的问题了,像myeclipse等开发工具也有集成JRE,那么电脑就有很多套JRE,同样执行java.exe有可能会得到不同的结果。
那么我们执行的是那一个java.exe?
当我们输入java XXX的时候,java.exe的工作就是找到合适的JRE来执行。Java.exe依照下面的逻辑来寻找JRE:
1,自己的目录下有没有JRE目录
2,父目录底下JRE子目录
3,查询windows registry(HKEY_LOCAL_MACHINE\Software\JavaSoft\Java\Runtime Environment\)
我们可以用path来指定执行哪个java.exe。当我们指定了path=d:\j2skd1.4.0\bin是,执行java.exe一定是d:\j2skd1.4.0\bin底下的java.exe,所以java.exe选到的是父目录d:\j2skd1.4.0底下的JRE。打开d:\j2skd1.4.0\jre\bin这个目录,您会看到client和server两个目录,里面都会分别看到jvm.dll,这就是Java虚拟机所在。
因此,在我们开发Java应用程序或是执行Java程序的时候,一定要记住两件事:
1,那一个java.exe被执行。
2,java.exe找到哪一套JRE。