本机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

相关link:http://fuseyism.com/openjdk/cvmi/java2vm.xhtml

首先,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.langjava.io 包的各种 JNI 导出,等等。

随着Java 9,引入了Java模块系统,这也影响了rt.jarrt.jar 已替换为驻留在 jmods 中的相应模块。此外,架构已从内部路径中删除,jre 子目录不再存在。

Java 9 还引入了一个实验性的提前编译器,至少在理论上可用于预编译 Java class 库。据我所知,截至 Java 14.

仍处于试验阶段