JVM全知道系列 -XX:+UseCompressedOops 压缩指针

少于 1 分钟阅读

-XX:+UseCompressedOops 使用压缩指向普通对象的指针. Oracle Java SE 7 缺省情况下,JVM最大堆小于32GB时,默认启用压缩指针. 查看详细参数 JDK 17 LTS JVM Options

压缩指针的好处

在JDK 1.6u23引入压缩指针,让32位JDK支持超过4GB的堆空间。有效减少64位平台的堆内存占用(有利于降低GC开销. e.g. 主要是类压缩指针)。提高CPU缓存命中率(能缓存更多的普通对象指针)。

核心探秘

JAVA对象模型

JAVA的对象由对象头、实例数据和对齐填充三部分组成。

对象头一般包含Mark Word和Klass Word两个指针,数组的对象头会额外多一个4byte的数组长度。Mark Word根据平台固定为4~8byte,Klass Word类元数据指针,指向元数据空间Metaspace

对齐填充是根据平台(32或64位)对未对齐的数据4或8byte补齐,进行补0

启用压缩指针

启用压缩指针之后,指针表示的含义从真实的地址偏移转换为基于对齐填充的对象偏移。 这样4byte(32位)指针就可以映射管理40e(2^32^-1))对象或32GB(8byte * 2^32^=32GB)的堆空间。

OOP

超过32GB的堆

可以通过通过 -XX:ObjectAlignmentInBytes=alignment 修改对象对齐来支持。最大堆空间 = 4GB(2^32^-1) * ObjectAlignmentInBytes。

GC算法中的应用

截至目前为止,除了ZGC算法外,其他全部GC算法都支持Compressed OOP(e.g. G1, Shenandoah GCJEP-404. etc)。

ZGC因为着色指针(Colored Pointers)的设计先天 不支持32位平台,不支持压缩指针优化,也无法单独开启类压缩指针。但是从 JDK 15 开始,-XX:+UseCompressedClassPointers 可以脱离 -XX:+UseCompressedOops 之外,单独开启。这种变动对使用ZGC垃圾回收算法或者堆大于32GB的JVM有比较大的意义,当然还是不支持Compressed OOP。

知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 TinyZ Zzh (包含链接: https://tinyzzh.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。 如有任何疑问,请 与我联系 (tinyzzh815@gmail.com)

TinyZ Zzh

TinyZ Zzh

专注于高并发服务器、网络游戏相关(Java、PHP、Unity3D、Unreal Engine等)技术,热爱游戏事业, 正在努力实现自我价值当中。

评论

  点击开始评论...