在 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.lang
和 java.util
的所有 类 都存在于 rt.jar(运行-time 的快捷方式)中,它将被加载到每个 java 程序中由 Bootstrap ClassLoader 执行。
src.zip
是 Java SE API 的源代码,它不包括热点源代码/VM 代码和其他一些用 C/C++ 编写的东西,但它是开放给大家下载。
我刚刚比较了 JAVA_HOME/src.zip
和 JAVA_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 迭代器。
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.lang
和 java.util
的所有 类 都存在于 rt.jar(运行-time 的快捷方式)中,它将被加载到每个 java 程序中由 Bootstrap ClassLoader 执行。
src.zip
是 Java SE API 的源代码,它不包括热点源代码/VM 代码和其他一些用 C/C++ 编写的东西,但它是开放给大家下载。
我刚刚比较了 JAVA_HOME/src.zip
和 JAVA_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 迭代器。