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

481 字
2 分钟
JVM全知道系列 -XX:+UseCompressedOops 压缩指针

-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=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。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
JVM全知道系列 -XX:+UseCompressedOops 压缩指针
https://tinyzzh.github.io/posts/2022-04-24-jvm_compressedoops/
作者
TinyZ Zzh
发布于
2022-04-24
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
TinyZ Zzh
专注于高并发服务器、网络游戏相关(Java、PHP、Unity3D、Unreal Engine等)技术,热爱游戏事业, 正在努力实现自我价值当中。
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
211
分类
38
标签
200
总字数
337,853
运行时长
0
最后活动
0 天前

文章目录