0
点赞
收藏
分享

微信扫一扫

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

工程与房产肖律师 2022-04-29 阅读 61
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分配在栈的栈帧的局部变量表中

在这里插入图片描述

可以看到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的地址
在这里插入图片描述
至此三个对象都已经追踪到了

举报

相关推荐

0 条评论