如何使用HSDB探秘运行时数据区

发布时间:2021-10-23 15:55:36 作者:柒染
来源:亿速云 阅读:115

本篇文章为大家展示了如何使用HSDB探秘运行时数据区,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

HSDB全称是HotSpotDebugger, HotSpot虚拟机的调试工具,在使用的时候,需要程序处在暂停的状态,可以直接使用Idea的debug工具. 使用HSDB可以看到堆栈里面相关的内容,

启动HSDB

无论哪种方式启动,都需要先知道当前java程序的进程号,我们使用jps命令,如下图所示:

然后我们使用命令 jhsdb hsdb --pid=87854 来启动HSDB,如下图所示:

如何使用HSDB探秘运行时数据区

使用HSDB查看JVM虚拟机栈信息

我们知道,在创建一个线程时,都会有一个为之分配一个jvm栈,如上图我们可以看到在java Threads中有5个线程,我们选中main线程,然后点击上面的查看栈信息的图标,如下图所示:

如何使用HSDB探秘运行时数据区

1:在原java Threads面板上,点第二个按钮,可召唤出Stack Memory for main 这个面板.

Stack Memory for main 面板主体有三大部分,如上图所述

2:最左侧是栈的内存地址

3:中间一列是该地址上存的值(大多是别的对象的地址),

4:最右侧是HotSpot的说明

5:在右侧的说明中, 我们可以此时栈中有两个栈帧(Frame)

大家看到 Young com/platform/tools/jvm/Main$TestObject 这个我们定义的对象,记住这个地址0x00000001161d11e0 代表这个对象是在栈中被引用

使用HSDB查看堆信息

我们的对象大都是在堆里面,我们可以借助HSDB看堆中有多少个实例对象,如下图所示

如何使用HSDB探秘运行时数据区

1:点击 Tools->Object Histogram ,打开右边的Object Histogram面板

2:在2处输入我们的类全名,然后点3望远镜搜索,在下面会显示 我们的类,有三个实例

4:可以双击选中我们的类, 也可以放大镜,可以打开Show Objects of Type 面板 看到三个实例的详情

其中第三个,就是我们在栈中看到的方法内的成员变量.

对于另外两个,需要通过反向指针查询 ,看哪个类引用了这个实例,来看是哪个变量

HSDB使用revptrs 看实例引用

对于上面还有两个地址, 我们不能确定是什么对象,所以我们可以通过指针反查来看他们被什么所引用,如下图所示:

如何使用HSDB探秘运行时数据区

如上图,我们可以看到,一个被Class对象所引用, 是类静态变量,一个被jvm/Main , 也就是我们Main类引用, 是类成员变量. 通过这个我们也可以总结, 静态变量,其实也是存在堆里面.

Class,static及Klass的关系

这个版本的hsdb 有些指令不支持,如mem , whatis等,所以要深入学习的小伙伴可以用jdk1.8的hsdb试下上述两个命令

多个Java对象(Java Object,在堆中)对应同一个Klass(在MetaSpace中)对应同一个Class对象(在堆中), 类的静态变量地址都存在Class对象的后面(所以也在堆中)。

上述内容就是如何使用HSDB探秘运行时数据区,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. JVM运行时的数据区域介绍
  2. JVM运行时数据区如何划分

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:有哪些Java集合面试题

下一篇:Docker化自动采集的方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》