如何分析 JVM 的 ObjectHeader 在启用指针压缩(Pointer Compression)后的 64 位机器内存布局变化

胖婷同学_7853

胖婷同学_7853

2026-04-28

543人浏览

原创

开启指针压缩后对象头实际占12字节(8字节Mark Word+4字节Klass Pointer),因8字节对齐填充至16字节。

如何分析 jvm 的 objectheader 在启用指针压缩(pointer compression)后的 64 位机器内存布局变化

怎么看开启指针压缩后对象头实际占多少字节

直接用 ClassLayout.parseInstance() 打印对象布局是最可靠的方式,它不依赖你“记得”理论值,而是读取 JVM 实际分配结果。关键前提是必须引入 jol-core 依赖,并确保运行在 64 位 JVM 上(java -version 输出含 64-Bit)。

常见错误现象:输出显示对象头为 16 字节(OFFSET 0–15),但误以为是 128 bit → 其实是 16 字节 × 8 = 128 bit,而启用压缩后对象头应为 12 字节(Mark Word 8 + Klass Pointer 4),加上对齐填充才凑成 16 字节总大小。别把「打印出的 OFFSET 范围」和「对象头真实长度」混为一谈。

  • 确认是否真启用了压缩:检查 JVM 启动参数中是否存在 -XX:-UseCompressedOops;默认是开启的,但某些容器镜像或旧脚本可能显式关闭它
  • 注意 ClassLayout 输出中 Instance size 是最终内存占用(含 padding),而对象头真实长度需看 OFFSET 0 到第一个字段起始位置之间的字节数
  • 空对象 new Object() 在压缩开启时,对象头固定为 12 字节,对齐后总大小为 16 字节;若看到 Instance size: 24,大概率是压缩被禁用了

为什么 Klass Pointer 在压缩下只占 4 字节却能寻址 64 位地址空间

JVM 并不是简单截断指针高 4 字节,而是采用「低 32 位偏移 + 16GB 对齐基址」的编码方式:所有类元数据被分配在内存中一个连续的、起始地址是 16GB 对齐的区域里,Klass Pointer 存储的是相对于该基址的 32 位偏移量(单位是字节)。只要整个元数据区不超过 16GB(实际通常远小于此),4 字节就足够表达任意偏移。

这个机制意味着:一旦堆内存超过 32GB(具体阈值与 GC 策略有关),JVM 可能自动禁用压缩;若手动指定大堆但未调整基址对齐,也会失败并报错 Unrecognized VM option 'UseCompressedOops' 或启动时提示 Failed to start JVM: CompressedOops is not supported。

  • 典型兼容边界:堆 ≤ 32GB 时,-XX:+UseCompressedOops 一般可安全启用;≥ 48GB 时基本失效
  • -XX:HeapBaseMinAddress 可手动设置基址,但极少需要干预;强行设错会导致 JVM 拒绝启动
  • 压缩只作用于普通对象引用(OOP)和类元数据指针(Klass Pointer),不影响 Mark Word(始终 8 字节)、数组长度(始终 4 字节)等固定字段

对比开启/关闭指针压缩时同一对象的内存差异

以一个含两个引用字段的类为例:class A { Object a; Object b; },在 64 位 JVM 下:

开启压缩:
  对象头:8(Mark Word)+ 4(Klass Pointer)= 12 字节  
  实例数据:4(a)+ 4(b)= 8 字节  
  总计 20 字节 → 对齐到 24 字节(+4 padding)

关闭压缩:
  对象头:8(Mark Word)+ 8(Klass Pointer)= 16 字节  
  实例数据:8(a)+ 8(b)= 16 字节  
  总计 32 字节 → 对齐到 32 字节(无需 padding)

单个对象多占 8 字节,100 万个该对象就多消耗约 8MB 堆内存——这还没算 GC 带来的额外开销(比如 card table 更大、GC 扫描更慢)。

  • 引用字段越多,压缩收益越明显;纯基本类型对象(如 int[])几乎不受影响
  • 关闭压缩后,String、ArrayList 等高频对象的实例数据膨胀最显著
  • 不要仅凭 Object 类测试:它没字段,掩盖了实例数据部分的差异;务必用带引用字段的类验证

容易被忽略的陷阱:-XX:+UseCompressedClassPointers 和 -XX:+UseCompressedOops 的关系

这两个参数常被混为一谈,但它们控制不同东西:UseCompressedOops 压缩的是「对象引用」(即字段里的 Object、String 等指针),而 UseCompressedClassPointers 压缩的是「类元数据指针」(即对象头里的 Klass Pointer)。JDK 7u40 后二者默认联动开启,但你可以单独关闭其中一个。

如果只关 UseCompressedOops 而保留 UseCompressedClassPointers,你会看到对象头仍是 12 字节(Klass Pointer 保持 4 字节),但所有引用字段从 4 字节涨到 8 字节——这种混合状态极难调试,且无实际好处。

  • 生产环境应保持两者一致:要么都开,要么都关;不要拆开配置
  • jstat -gc 看不到压缩状态,必须用 java -XX:+PrintFlagsFinal -version | grep UseCompressed 确认实际生效值
  • JEP 450(紧凑对象头)已在 JDK 22+ 引入,它进一步将对象头压到固定 64 位(8 字节),但目前仍需显式启用,且不改变指针压缩本身的逻辑
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11497

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8602

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7412

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1224

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

988

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1476

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3029

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20271

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1315

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习