当以详细模式运行 jvm 时,它显示文件正在从共享对象文件加载,如下所示
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
这个共享对象文件是什么?我认为这些是 rt.jar 中的文件,它是从那里加载的;但是 rt.jar 正在打开很长的路要走
[Loaded java.security.BasicPermissionCollection from shared objects file]
[Opened C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded sun.misc.JavaSecurityProtectionDomainAccess from C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.security.ProtectionDomain$2 from C:\Program Files\Java\jre6\lib\rt.jar]
在提取 rt.jar 后,我发现它包含从共享对象文件加载的所有类。
最佳答案
这是类数据共享。运行 Sun/Oracle Client HotSpot 并启用共享时(默认的 -Xshare:auto
或 -Xshare:on
),classes.jsa
文件是内存映射的。该文件包含许多内部表示的类(在 classlist
文件中列出)适合运行它的机器的精确配置。这个想法是可以快速加载类,从而更快地启动 JVM。很快就会遇到未涵盖的类,并且需要打开 rt.jar
并根据需要按常规方式加载类。
引用:
关于jvm - 什么是共享对象文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4393940/