栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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的地址

至此三个对象都已经追踪到了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/845630.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号