注:此处安装的JDK版本为8
一、JDK、JRE、JVM的关系
JDK包含JRE,JRE包含JVM:
到安装的JDK目录中可以看到,有jdk和jre两个文件夹
打开上图中的jre,目录里面是这样的:
进入jdk文件夹,发现里面也有jre:
打开此处jre文件夹,里面是这样:
发现jdk文件夹里面的jre和外面单独的jre里面内容看着一样。
如果去掉jdk目录下的jre,但是外面那个独立的jre在,可以正常编译和执行:
如果有jdk下的jre,但是没有外面单独的jre:可以正常编译,但是执行java字节码文件时报错:
将独立的jre放回来后,执行成功:
总结:
有jdk下的jre,没有外面独立的jre:可以正常编译,但是不能执行。
有外面独立的jre,没有jdk下的jre:可以正常编译和执行。
编译时,首先找jdk下的jre,没有的话,再找上层目录独立的jre,还没找到就回去注册表找,都没找到就不能编译。
执行时,依赖jdk外独立的jre,没有的话会报错,不能正常执行。
jdk下的jre主要用于运行java命令。
编译会使用javac.exe,它是用java写的,所以运行javac.exe需要jre,没有jre的话无法编译。其他像javadoc等java命令也都是java写的,它们的执行也需要jre。编译时,首先会找jdk下的jre,没有的话找外面独立的那个jre,还没找到的话会去注册表里面找jre。
注册表查看JRE方法:搜索框中输入“regedit”,找到 “HKEY_LOCAL_MACHINE”下---》“SOFTWARE”下---》“JavaSoft”---》“Java Runtime Environment”
这里的Java Runtime Environment就是JRE
二、编译原理
dt.jar和tools.jar是两个java最基本的包,tools.jar是java中最核心的包,编译时的javac命令其实是通过javac.exe去调用tools.jar下的Mian类
证明:更改tools.jar名称,然后编译,出现报错:
tools.jar名称改回来后,重新编译,编译成功:
三、运行原理
java.exe执行字节码文件时,其实是调用了JVM,JVM位置:jre目录下---》bin目录下---》server目录下---》jvm.dll程序,但jvm不能单独完成对字节码文件的解释,要加上jre目录下的lib库才可以,所以JRE = JVM + lib库