前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用HSDB查看类变量的内存布局(5)

使用HSDB查看类变量的内存布局(5)

作者头像
全栈程序员站长
发布2021-04-07 11:39:04
8170
发布2021-04-07 11:39:04
举报
文章被收录于专栏:全栈程序员必看

如下的实例来自Hotspot 垃圾回收之oop_iterate(一) 源码解析,我做了一些微小的改动。

查看如下实例的内存布局:

代码语言:javascript
复制
package com.test;

public class Parent {
	private   Integer     a = 1;
	protected long        b = 2;
	protected final short c = 3;
	public    char        d ='A';
}  

Son类继承Parent类,如下:

代码语言:javascript
复制
package com.test;

public class Son extends Parent {
	private   Integer     a = 11;
	protected long        b = 12;
	protected final short c = 13;
	public    char        d ='B';
	
	public static void main(String args[]){
		Son s = new Son();
		System.out.println(s.a);
	}
}

连接上HSDB后,在控制台输入universe命令,查看当前Java进程的堆内存,如下所示:

代码语言:javascript
复制
hsdb> universe
Heap Parameters:
Gen 0:
  eden [0x00000000ff600000,0x00000000ff680030,0x00000000ff8b0000) space capacity = 2818048, 18.606354469476745 used
  from [0x00000000ff8b0000,0x00000000ff8b0000,0x00000000ff900000) space capacity = 327680, 0.0 used
  to [0x00000000ff900000,0x00000000ff900000,0x00000000ff950000) space capacity = 327680, 0.0 usedInvocations: 0
Gen 1: old [0x00000000ff950000,0x00000000ff950000,0x0000000100000000) space capacity = 7012352, 0.0 usedInvocations: 0

接着输入如下命令搜索对象的起始地址:

代码语言:javascript
复制
scanoops 0x00000000ff600000 0x0000000100000000 com.test.Son

命令scanoops查看指定类型的实例对象,接受两个必选参数和一个可选参数:必选参数是要扫描的地址范围,一个是起始地址一个是结束地址;可选参数用于指定要扫描什么类型的实例对象。

得到表示Son实例的instanceOop的内存首地址,如下:

代码语言:javascript
复制
0x00000000ff670190 com/test/Son

使用inspect命令查看这个地址处的oop的全部数据,如下:

代码语言:javascript
复制
hsdb> inspect 0x00000000ff670190
instance of Oop for com/test/Son @ 0x00000000ff670190 @ 0x00000000ff670190 (size = 48)
_mark: 1
_metadata._compressed_klass: InstanceKlass for com/test/Son
a: Oop for java/lang/Integer @ 0x00000000ff62e970 Oop for java/lang/Integer @ 0x00000000ff62e970
b: 2
c: 3
d: 'A'
a: Oop for java/lang/Integer @ 0x00000000ff62ea10 Oop for java/lang/Integer @ 0x00000000ff62ea10
b: 12
c: 13
d: 'B'

使用了指针压缩,如果不想使用指针压缩,可以使用如下jdb命令:

代码语言:javascript
复制
jdb -XX:+UseSerialGC -Xmx10m -XX:-UseCompressedOops

另外还可以使用图形化的方式查看内存布局。单击HSDB的Tools->Inspector菜单选项,输入地址即可,如下图所示。

单击HSDB工具栏的Tools->Class Brower命令,输入Parent和Son后,便能查看类中所定义的各个字段的偏移量,如下图所示。

不进行指针压缩,使用如下命令:

代码语言:javascript
复制
jdb -XX:+UseSerialGC -Xmx10m -XX:-UseCompressedOops

使用univers、scanoops与inspector命令查看对象的内存布局,如下:

代码语言:javascript
复制
hsdb> inspect 0x00007f0ae468b198
instance of Oop for com/test/Son @ 0x00007f0ae468b198 @ 0x00007f0ae468b198 (size = 64)
_mark: 1
_metadata._klass: InstanceKlass for com/test/Son
a: Oop for java/lang/Integer @ 0x00007f0ae463d4d8 Oop for java/lang/Integer @ 0x00007f0ae463d4d8
b: 2
c: 3
d: 'A'
a: Oop for java/lang/Integer @ 0x00007f0ae463d5c8 Oop for java/lang/Integer @ 0x00007f0ae463d5c8
b: 12
c: 13
d: 'B'

使用图形化的方式查看内存布局,如下图所示。

查看类中所定义的各个字段的偏移量,如下图所示。

除了使用HotSpot虚拟机命令、HSDB外,还可以使用JOL等来查看字段的内存布局,使用比较简单,这里不在介绍。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年11月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档