Hotspot JVM中CDS功能为什么需要开启Compressed Oops特性?
CDS与Compressed Oops关联的底层原理
- 先明确两个特性的核心设计:
- Class Data Sharing(CDS) 的核心逻辑是将预解析的类元数据、对象内存布局快照固化到
.jsa共享归档文件中,JVM启动时直接将归档映射到内存,跳过类解析加载流程,同时多进程可共享这部分只读内存以降低开销。 - Compressed Oops 是64位JVM的优化特性,通过
-XX:+UseCompressedOops开启后,会将64位对象指针压缩为32位,采用「基址+偏移」的方式寻址,最高支持32GB堆内存,可降低内存占用、提升CPU缓存命中率。
- Class Data Sharing(CDS) 的核心逻辑是将预解析的类元数据、对象内存布局快照固化到
- 二者强绑定的底层原因核心是CDS归档固化了压缩指针的内存布局:
执行
java -Xshare:dump生成CDS归档文件时,JVM会按照开启Compressed Oops的规则,完成类元数据内所有对象指针的预计算,包括指针的偏移量、相对于归档内存映射基址的寻址逻辑、对象对齐规则都会固化到归档文件中。 - 关闭Compressed Oops时CDS无法工作的根因:
如果JVM启动时关闭了Compressed Oops,全程使用64位原生指针寻址,和归档中预存的32位压缩指针的长度、寻址逻辑完全不兼容,直接映射归档内容会出现地址解析错误、内存布局不匹配的问题,轻则类加载失败,重则JVM崩溃,因此JVM会在校验阶段就禁止CDS在关闭Compressed Oops的场景下使用。
内容的提问来源于stack exchange,提问作者swz
相关产品推荐
相关产品推荐

