在 Hotspot JVM 中,为什么 CDS 需要 Compressed Oops?

In Hotspot JVM, why CDS needs Compressed Oops?

我阅读了这个 post“https://malloc.se/blog/zgc-jdk15”,最后一个索引大约是 Class Data Sharing。 在这个索引中,

This feature(means CDS) only work when the Compressed Oops feature was enable(-XX:+UseCompressedOops).

我对CDS和Compress Oops略知一二,但不明白它们的关系

CDS(Class 数据共享)不需要压缩 OOP。但是,在 JDK 15 之前,它仅在默认配置下工作,其中 UseCompressedOops=trueUseCompressedClassPointers=true.

JDK-8232069中描述了问题和解决方案。

要使 CDS 存档有效,UseCompressedOopsUseCompressedClassPointers 的运行时值必须与存档生成期间使用的值匹配。在 JDK-8232069 之前,这些值未保存在存档中,并且 JVM 假定已打开压缩 OOP(默认)。因此,CDS 与 ZGC 不兼容,因为 ZGC 需要关闭压缩 OOP。

为使CDS与ZGC兼容,JDK-8232069将UseCompressedOopsUseCompressedClassPointers的值写入存档,JVM启动时会检查当前是否标志匹配那些保存的值。所以现在(自 JDK 15)CDS 可以与压缩 OOP 的任一配置一起使用,现在它与 ZGC 兼容。