JDK、JRE、JVM之间的关系:
首先看看JDK与JRE的区别与联系,如下图所示:
由图可知: JDK = JRE + Tools&Tool APIs
JDK的核心是Java SE API。Java SE API是一些预定义的类库,开发人员需要用这些类来访问Java语言的功能。Java SE API包括一些重要的语言结构以及基本图形,网络和文件I/O。我们在自己的程序中,调用前辈们写好的这些Class,来作为我们自己开发的一个基础。当然,现在已经有越来越多的性能更好或者功能更强大的第三方类库供我们使用。一般来说, Java API的非I/O部分对于运行Java的所有平台是相同的,而I/O部分则仅在通用Java环境中实现。
JDK的种类:最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。
JRE(Java RuntimeEnvironment,Java运行环境),运行JAVA程序所必须的环境的集合。J2RE是Java2 Runtime Environment,即Java运行环境,有时简称JRE.如果你只需要运行Java程序或Applet,下载并安装它即可。如果你要自行开发 Java软件,请下载JDK. 在JDK中附带有JRE.注意由于Microsoft对Java的支持不完全,请不要使用IE自带的虚拟机来运行 Applet,务必安装一个JRE或JDK.包含:
1. Java Runtime Environment(JRE)是可以在其上运行、测试和传输应用程序的Java平台。它包括Java JVM标准实现、Java平台核心类库和支持文件。它不包含开发工具——编译器、调试器和其它工具。
JVM:Java Virtual Mechinal(JAVA虚拟机)。JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用。Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性。JVM 对上层的 Java 源文件是不关心的,它关注的只是由源文件生成的类文件( class file )。类文件的组成包括 JVM 指令集,符号表以及一些补助信息。
2. JRE所需辅助软件——Java Plug-in——以便在浏览器中运行applet.
一般情况下,如果您安装了JDK,那么你的电脑地下一定会有两套JRE、一套位于<jdk安装目录>\jre底下,另一套位于C:\Program File\JavaSoft底下(JDK1.4则是放在C:\Program File\Java底下)。如果你只下载了JRE而非JDK,那么就只会在C:\Program File\JavaSoft底下安装唯一的一套JRE。
由图可知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。