打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
关于JDK、JRE与JVM
1.两个jre
如果我们下载JDK以后选择默认安装的话,在我们的系统中会出现两个JRE,一个位于:<jdk安装目录>\jre下,另一个位于:C:/program File/java下。在安装过程中会提示是否安装C:/program File/java下面的jre。
2.为什么要有两个jre?
jre的地位就像是一台pc机,我们有两个jre也就相当于我们拥有了两个可以运行java程序的pc机,每个jre的bin下面都有几个jvm,就是我们所谓的虚拟机。
为什么要安装两个呢?因为jdk里面的许多开发工具本身也是用java语言编写的,这些工具要想正常的工作也需要一个jre,比如:javac.exe,jar.exe,他们位于<jdk安装目录>\lib\tools.jar当中。
java的编译器使用java语言写的,这个千真万确!可以输入:
java com.sun.tools.javac.Main结果跟输入javac是一样的,你也可以把tools.jar解压就可以看到javac这个类。javac.exe只不过是一个包装器,这样用起来更方便。
3.我们实际使用的是哪一个jre?
既然我们的机器上有多个jre,那么我们使用的是那一个呢?这个要取决于java.exe。
当我们在命令行输入java XXX的时候,java.exe负责找到jre来执行类文件。查找过程如下:
(1)在自己的目录下看看有没有jre
(2)在自己的父目录下看看有没有jre
(3)查询windows注册表项:HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment.
所以说,java.exe的执行结果与那一个java.exe被执行然后使用哪一个jre有莫大的关系。
因为在安装jdk的时候会默认在C:\WINDOWS\system32下面也安装java.exe,
这就揭示了我们为什么要在环境变量中设置path,如果没有设置path为jdk/bin,那么java.exe是根据已有的path从c:/windows/system32启动,在查找jre的时候会到c:/windows和c:/windows/system32下查找,找不到然后就去注册表查找。而设置了path,应该是把jdk/bin这一项放在path的前面,这样启动java.exe检查path环境变量的时候才会找到正确的路径。
同时我们已经明白了为什么安装了jdk在还没有设置环境变量以前,我们可以在命令行执行java,而不可以执行javac,因为java.exe从已有的path中是可以找到。
测试1:我们在执行java程序的时候可以使用:-verbose选项来查看我们使用的是哪一个jre
这是截取的一段输出内容:
[Loaded sun.misc.AtomicLongCSImpl from E:\jdk1.6\jre\lib\rt.jar]
[Loaded java.lang.Boolean from E:\jdk1.6\jre\lib\rt.jar]
[Loaded java.lang.Character from E:\jdk1.6\jre\lib\rt.jar]
[Loaded java.lang.Number from E:\jdk1.6\jre\lib\rt.jar]
[Loaded java.lang.Float from E:\jdk1.6\jre\lib\rt.jar]
[Loaded java.lang.Double from E:\jdk1.6\jre\lib\rt.jar]
[Loaded java.lang.Byte from E:\jdk1.6\jre\lib\rt.jar]
[Loaded java.lang.Short from E:\jdk1.6\jre\lib\rt.jar]
我们可以看出,在我的机器上是使用的E:\jdk1.6\jre\
如果我们已经知道了这个原理,我们可以使用另外的jre,这样做:
(1)首先编译一个简单的java源文件
(2)删掉为jdk设置的环境变量path和classpath
(3)把这个class文件复制到c:/windows/system32下面,切换到这个目录,运行:
   java -verbose **
这个时候你就会看到,我们使用了另外的一个jre,因为java.exe在c:/windows/system32和c:/windows下面都没有找到jre就去注册表里找,注册表里面是这样的:
JavaHome   E:\jre1.6
RuntimeLib E:\jre1.6\bin\client\jvm.dll
所以就是用了这个E:\jre1.6\bin\client\jvm.dll。
测试2:
如果我们在classpath中加入tools.jar,把path当中的jdk1.6\bin删掉,然后切换到一个java源文件,在命令行输入:java -verbose com.sun.tools.javac.Main **.java
我们会看到这个源文件被编译了,而且从输出的信息我们可以看到,jvm用到的tools.jar来在我们刚才的环境变量设置的路径,而用到的rt.jar却是E:\jre1.6下面那个。
当我们接着执行:java -verbose **的时候
我们会发现,执行成功,这是我截取的一段输出的信息:
E:\jre1.6\lib\rt.jar]
java.nio.charset.Charset$3 from E:\jre1.6\lib\rt.jar]
E:\jre1.6\lib\charsets.jar]
也就是说我们使用的是E:\jre1.6\下面的这个JVM。
结论:
也就是说我们只需要把tools.jar复制到E:\jre1.6\lib下面,然后把它添加到classpath中,那么即使我们不用设置path,我们一样可以编译运行java程序。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
谈一谈|JDK、JRE和JVM的解释以及联系和区别
java环境变量配置_行动创造丰收
Java环境变量配置方法详解
部署Oracle JDK
windows系统下JDK1.6环境变量配置
JDK,JRE与JVM浅析(整理)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服