标题说明了一切。我想研究一下jvm可能会找到一个java / lang / Object.so(与Class ...以及具有本机的任何其他Java类相同),或等效的,但无处可寻。我试图研究OpenJDK的编译脚本,但无法理解它们。
答案:libjava.so
首先,是所提供的Java类库的Java代码jre/lib/rt.jar
。在JVM启动/执行期间,它不会被即时编译为本机代码,而是由Hotspot编译器实时进行编译(如果执行了阈值次数,否则将使用解释器)。
有一种名为的优化Class Data Sharing
,可以从rt.jar
JVM中解析类并存储内部使用的内存中类表示形式,jre/lib/[arch]/[type]/classes.jsa
从而不必一遍又一遍地处理所涵盖的类。该文件可以通过内存映射由多个JVM实例共享。
然后是jre/lib/[arch]/[type]/libjvm.so
,其中包含实际的JVM代码,包括Hotspot编译器。
最后,还有许多其他库,jre/lib/[arch]
其中包含Java类库所需的JNI实现。例如,libjava.so
包含java.lang
和java.io
包的各种JNI导出,以及其他。
随着Java 9的推出,Java模块系统也受到了影响rt.jar
。rt.jar
被替换为中的相应模块jmods
。此外,该体系结构已从内部路径删除,并且该jre
子目录已不存在。
Java 9还引入了一个实验性的提前编译器,至少在理论上可以用于预编译Java类库。AFAIK,从Java 14开始仍处于试验阶段。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句