本机jvm文件(Object.c,Class.c)compiled/linked到哪里去了?
Where are the native jvm files (Object.c, Class.c) compiled/linked to?
标题说明了一切。
我在想调查 jvm 可能会找到一个 java/lang/Object.so(对于 Class... 和任何其他具有原生的 java class 也是如此),或等价物,却无处可寻。我试图查看 OpenJDK 的编译脚本,但无法理解它们。
答案:libjava.so
首先,jre/lib/rt.jar
提供了 Java class 库的 Java 代码。它不是提前编译成本机代码,而是在 JVM startup/execution.[=23= 期间由 Hotspot 编译器即时编译(如果执行次数达到阈值,否则使用解释器) ]
有一个名为 Class Data Sharing
的优化,它从 rt.jar
解析 classes 并将 JVM 使用的内部内存 class 表示存储在 jre/lib/[arch]/[type]/classes.jsa
这样所涵盖的 classes 就不必一次又一次地处理了。这个文件可以通过内存映射的方式被多个JVM实例共享。
然后是 jre/lib/[arch]/[type]/libjvm.so
,其中包含实际的 JVM 代码,包括 Hotspot 编译器。
最后,jre/lib/[arch]
中还有许多其他库包含 Java class 库所需的 JNI 实现。例如,libjava.so
包含 java.lang
和 java.io
包的各种 JNI 导出,等等。
随着Java 9,引入了Java模块系统,这也影响了rt.jar
。 rt.jar
已替换为驻留在 jmods
中的相应模块。此外,架构已从内部路径中删除,jre
子目录不再存在。
Java 9 还引入了一个实验性的提前编译器,至少在理论上可用于预编译 Java class 库。据我所知,截至 Java 14.
仍处于试验阶段
标题说明了一切。 我在想调查 jvm 可能会找到一个 java/lang/Object.so(对于 Class... 和任何其他具有原生的 java class 也是如此),或等价物,却无处可寻。我试图查看 OpenJDK 的编译脚本,但无法理解它们。
答案:libjava.so
首先,jre/lib/rt.jar
提供了 Java class 库的 Java 代码。它不是提前编译成本机代码,而是在 JVM startup/execution.[=23= 期间由 Hotspot 编译器即时编译(如果执行次数达到阈值,否则使用解释器) ]
有一个名为 Class Data Sharing
的优化,它从 rt.jar
解析 classes 并将 JVM 使用的内部内存 class 表示存储在 jre/lib/[arch]/[type]/classes.jsa
这样所涵盖的 classes 就不必一次又一次地处理了。这个文件可以通过内存映射的方式被多个JVM实例共享。
然后是 jre/lib/[arch]/[type]/libjvm.so
,其中包含实际的 JVM 代码,包括 Hotspot 编译器。
最后,jre/lib/[arch]
中还有许多其他库包含 Java class 库所需的 JNI 实现。例如,libjava.so
包含 java.lang
和 java.io
包的各种 JNI 导出,等等。
随着Java 9,引入了Java模块系统,这也影响了rt.jar
。 rt.jar
已替换为驻留在 jmods
中的相应模块。此外,架构已从内部路径中删除,jre
子目录不再存在。
Java 9 还引入了一个实验性的提前编译器,至少在理论上可用于预编译 Java class 库。据我所知,截至 Java 14.
仍处于试验阶段