在 jvm 中加载 java 热点 类

Loading of java hotspot classes in jvm

Oracle documentation 将 /jdk1.7.0/jre/lib/rt.jar 描述为 bootstrap classes for java 运行时,我很好奇这些是否是曾经在 运行 是 JDK 而不是 JRE 时加载过,如果是这样的话,它们如何在运行时被热点 classes 替换?

例如 rt.jar 似乎不包含对应于 hotspot/jdk/src/share/classes/java/util/Collections.java 的 class,因此如果我将 JDK6 版本添加到eclipse 作为 JDK 并在调试器中逐步执行以下操作:

Collections.emptySet().iterator();

我得到了与 rt.jar/java.util.Collections 对应的代码,它创建了一个新的迭代器实例,而来自 src.zip 的热点版本没有出现,它汇集了一个空迭代器在场。

我的理解一直是热点代码将是之前 to/during 运行时链接的内容,所以我怀疑我只是错过了位置,但如果这不是真的,热点代码如何获取已链接?

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

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

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

Java release of the JCL source as part of the OpenJDK reference implementation have differences between their src.zip (with the corresponding compiled classes in rt.jar), and the backported OpenJDK 6 source code that is available online.

之前版本的 SE 发行版

原因是来自 OpenJDK 7 的更改(例如池化迭代器)可能会反向移植到 OpenJDK 6 版本中,而无需在 any [=26= 中进行相应的更改] SE 6 版本,如来自 OpenJDK 6 project:

的 SCM 图所示

正如 Arkantos 提到的,Bootstrap ClassLoader 将 load rt.jar,包括 Collections.class 和 non-pooled SE 6 发行版中的 non-pooled 迭代器。