2015-02-06 56 views
0

Oracle documentation将/jdk1.7.0/jre/lib/rt.jar描述为用于java运行时的引导类,我很好奇它们在运行JDK而不是JRE时是否加载过,以及if那么在运行时如何将这些替换为热点类呢?在jvm中加载java热点类

例如rt.jar似乎没有包含与hotspot/jdk/src/share/classes/java/util/Collections.java相对应的类,因此如果我将JDK6版本作为JDK添加到eclipse中,通过在调试器中执行以下操作:

Collections.emptySet().iterator(); 

我得到对应的rt.jar /代码这将创建一个新的迭代器实例j​​ava.util.Collections中,wheras热点版本从src.zip哪些池空迭代似乎并不存在。

我的理解一直是,热点代码将在运行前/运行期间链接,因此我怀疑我刚刚错过了位置,但是如果这不是真的,热点代码如何链接?

回答

0

爪哇SE分布为JCL源的release之前版本作为在OpenJDK reference实现的一部分具有其src.zip之间的差异(在rt.jar中相应的编译的类),并且backported的OpenJDK 6的源代码是available online

其原因是,从OpenJDK 7的,变化,例如该合并迭代器,可以被移植入的OpenJDK 6个版本,无需在正在作出任何的Java SE 6版本的相应变化,通过从该SCM图所示OpenJDK 6 project

http://openjdk.java.net/projects/jdk6/images/OpenJDK6-genealogy.png

如Arkantos所提到的,自举类加载器将load rt.jar,包括Collections.class在Java SE 6分布中的非池迭代器。

1

所有Java程序都需要运行JRE。即使JDK在其中也有一个子文件夹jre。 JDK是供开发人员编写,编译,剖析Java程序的。所有来自java.langjava.util的类都存在于rt.jar(运行时的快捷方式)中,该类将在Bootstrap ClassLoader执行的每个Java程序中加载。

src.zip是Java SE APIs的源代码,它不包含热点源代码/虚拟机代码以及用C/C++编写的其他一些东西,但它可供所有人下载。

我刚刚比较了JAVA_HOME/src.zipJAVA_HOME/jre/lib/rt.jar中的java.util.Collections.emptySet().iterator(),发现它们是相同的。

+0

感谢您的详细信息,你没有说你在哪个版本的Java比较?我向你提供了Bootstrap Class Loader的参考资料,但由于我必须自己做研究才能完全回答我自己的问题,所以我已将其作为答案发布。 – MilesHampson 2015-02-09 10:28:48

+0

我比较了那些有jdk8u25的本地文件 – Arkantos 2015-02-09 15:52:02