如何通过 HSDB (HotSpot Debugger) 直观观察 Java 对象在物理内存中的二进制布局

云磊同学_8126

云磊同学_8126

2026-04-15

366人浏览

原创

hsdb不显示裸二进制,而是按jvm的oop/klass模型解析内存:inspect展示字段偏移与指针值,scanoops定位对象并结合universe/findpc验证gc区域归属,class browser显示字段线性布局及offset,需注意压缩指针解压与对齐填充。

如何通过 hsdb (hotspot debugger) 直观观察 java 对象在物理内存中的二进制布局

HSDB 不能直接显示“二进制布局”(比如逐字节 dump 出 01010101),它展示的是 HotSpot 内部的 Oop/Klass 抽象结构,但通过 inspect、scanoops、Class Browser 等命令,你能准确定位字段偏移、指针值、内存区域归属——这比裸二进制更贴近 JVM 实际语义。

用 inspect 查看对象头与实例数据的原始内存映射

HSDB 的 inspect 命令输出的是对象在内存中被 JVM 解析后的结构视图,不是 hex dump。它会明确标出 _mark、_metadata._compressed_klass、字段名及对应地址,相当于把内存按 JVM 的 Oop 模型“翻译”出来。

  • 运行 inspect 0x00000000ff670190 后看到的 a: Oop for java/lang/Integer @ 0x00000000ff62e970,说明字段 a 是一个引用,其值(即存储的地址)是 0x00000000ff62e970,不是字段内容本身
  • _metadata._compressed_klass 显示的是压缩后的类指针(如果启用了 -XX:+UseCompressedClassPointers),真实 Klass 地址需解压计算;不压缩时直接显示完整 8 字节地址
  • 字段顺序不一定和源码声明顺序一致:JVM 会按宽度重排(long/double → int → short/char → byte/boolean → 引用),Class Browser 工具能直观看到每个字段的 offset(如 a 在 offset 12)

用 scanoops 定位对象起始地址并验证内存区域归属

对象物理地址只是一串数字,关键是要确认它落在哪个 GC 区(Eden / From / Old)、是否在 TLAB 内、是否被压缩指针影响。这必须结合 universe 和 findpc 使用。

java-enterprise
java-enterprise

Java企业开发专家,专注于Spring Boot、微服务架构和JVM优化。适用于:Java语言掌握、

下载
  • universe 输出里会列出 Eden、From、Old 的起止地址(如 eden [0x00000000ff600000,0x00000000ff680030,0x00000000ff8b0000)),这是后续扫描的合法范围
  • scanoops 0x00000000ff600000 0x00000000ff680030 java.lang.String 扫出的每个地址,都要用 findpc 0x00000000ff670190 验证是否真在 Eden 内——避免误扫到元空间或栈内存
  • 若 JVM 启用了 -XX:+UseCompressedOops,所有堆内对象引用都是 4 字节整数,但 inspect 会自动解压显示为 8 字节逻辑地址;你不能直接拿 scanoops 结果当“原始二进制”去 hex 编辑器里查

用 Class Browser 查字段偏移,理解实例数据如何线性排布

字段在对象内存中是连续存放的(除去对齐填充),Class Browser 显示的 offset 就是从对象起始地址开始的字节偏移量。这是最接近“物理布局”的可验证信息。

  • 打开 Tools → Class Browser,输入类名(如 Test2),它列出所有字段及其 offset(例如 int x 在 offset 12,Object ref 在 offset 16)
  • 再用 inspect 查看该对象地址,对比字段值是否出现在对应 offset:比如 ref 字段值是 0x00000000ff62ea10,那在 0x00000000ff670190 + 16 处的 4 或 8 字节内存内容就该等于这个值(取决于是否压缩)
  • 注意对齐填充:如果字段总长不是 8 的倍数,JVM 会在末尾补 0~7 字节,这部分不会显示在 Class Browser 中,但会影响下一个对象的起始位置

真正难的不是找地址或看字段,而是区分“指针值”和“指针指向的内容”——inspect 显示的 Oop for java/lang/Integer @ 0x... 是引用字段的值(即地址),而那个地址处的内容要另起一次 inspect 才能看到。漏掉这一层跳转,就永远停留在表层。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

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

2023.06.15

10397

6

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

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

2023.07.05

7522

9

java自学难吗
java自学难吗

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

2023.07.31

6592

8

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

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

2023.08.01

1124

3

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

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

2023.08.02

928

3

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

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

2023.08.02

1356

5

java有什么用
java有什么用

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

2023.08.02

2729

5

java在线网站
java在线网站

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

2023.08.03

20051

3

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

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

2023.08.03

1215

8

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习