在jvm中加载java热点类

时间:2015-02-06 08:41:53

标签: java eclipse jvm jvm-hotspot

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

例如rt.jar似乎不包含与hotspot / jdk / src / share / classes / java / util / Collections.java对应的类,所以如果我将JDK6版本作为JDK添加到eclipse中并逐步完成调试器中的以下内容:

Collections.emptySet().iterator();

我得到了与rt.jar / java.util.Collections相对应的代码,它创建了一个新的迭代器实例,而src.zip中的热点版本对于一个空迭代器似乎没有出现。

我的理解一直是热点代码将是在运行时之前/期间链接的内容,因此我怀疑我刚刚错过了位置,但如果不是这样,那么热点代码是如何链接进来的? / p>

2 个答案:

答案 0 :(得分:1)

所有Java程序都需要运行JRE。甚至JDK里面也有一个子文件夹jre。 JDK是供开发人员编写,编译,配置java程序的。来自java.langjava.util的所有类都出现在rt.jar(运行时的快捷方式)中,它将在Bootstrap ClassLoader的每个java程序执行时加载。

src.zip是Java SE API的源代码,它不包含热点源代码/ VM代码和其他一些用C / C ++编写的东西,但它可以下载大家。

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

答案 1 :(得分:0)

作为OpenJDK release实现的一部分,JCL源代码reference之前的版本的Java SE发行版在它们的src.zip(与rt.jar中相应的编译类)之间存在差异,并且backported OpenJDK 6源代码available online

原因是来自OpenJDK 7的更改(例如池化迭代器)可能会被反向移植到OpenJDK 6版本中,而不会在任何 Java SE 6版本中进行相应的更改,如此所示来自OpenJDK 6 project的SCM图:

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

正如Arkantos所提到的,Bootstrap ClassLoader将load rt.jar,包括带有Java SE 6发行版中非池化迭代器的Collections.class。