JVM之使用JHSDB的执行操作分析

本文详细介绍了如何使用JHSDB工具进行Java对象内存分配的调试,包括静态对象、实例对象和局部变量的内存定位。通过设置断点、查看堆参数、扫描内存区域以及深入堆栈内存,成功追踪到三个不同对象的内存位置,验证了它们分别存在于方法区、Java堆和栈帧的局部变量表中。这个过程对于理解Java内存管理和优化代码具有重要意义。
摘要由CSDN通过智能技术生成
public class JHSDBTest {
    static class Test{
        static ObjectHolder staticObj = new ObjectHolder();
        ObjectHolder instanceObj = new ObjectHolder();
        void foo(){
            ObjectHolder localObj = new ObjectHolder();
            System.out.println("done!");//在该处设置断点
        }
    }

    private static class ObjectHolder{}
    public static void main(String[] args) {
        Test test = new JHSDBTest.Test();
        test.foo();
    }
}

staticObj 分配在方法区中,instanceObj分配在java堆中,localObj分配在栈的栈帧的局部变量表中

设置断点进行debug

jps 查看线程

在这里插入图片描述

使用命令 jhsdb hsdbb --pid 进程pid 打开hsdb图形界面
我的是
jhsdb hsdb --pid 50616 打开以后是这样的
在这里插入图片描述
然后点击tool->Heap Parameters查看堆中参数情况,为后面验证是否在前面所说的堆中的分配进行验证
在这里插入图片描述

可以看到eden和form,to区的内存分布

在这里插入图片描述
注意这两个地址,后面查看内存里面的变量要用到它
在这里插入图片描述
点击windows->console查看具体变量的地址
在这里插入图片描述
打开之后输入 scanoops 刚刚eden区的起始地址 to的最后地址 包名.类名(注意中间是空格)
在这里插入图片描述
然后通过revtptrs 对象的地址来查看地址的具体分配情况(地址为前三个地址)
在这里插入图片描述
在这里插入图片描述

这里我们可以通过inspector来查看
在这里插入图片描述
在这里插入图片描述
注意这里输入的是刚刚revptrs查看的地址,然后可以看到下面的内容
在这里插入图片描述

看到类型是java.lang.Class的类型。可以看到是静态的方法
接下来查找第二个对象
在这里插入图片描述

按以上步骤进行查询最后发现
在这里插入图片描述
在这里插入图片描述
可以看到是instanceObj的对象,并且对照eden中的地址发现是放在java堆中的

但是在查看第三个的时候发现显示null
在这里插入图片描述
这个时候不要慌,我们同样可以爱 java Thread的main中进行查看(刚开始进来的时候就是java Thread)
在这里插入图片描述

然后点击 stack memory…
在这里插入图片描述
从下图可以看到地址 局部变量localObj的地址
在这里插入图片描述
至此三个对象都已经追踪到了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值