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>
答案 0 :(得分:1)
所有Java程序都需要运行JRE。甚至JDK里面也有一个子文件夹jre
。 JDK是供开发人员编写,编译,配置java程序的。来自java.lang
和java.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。