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的地址
至此三个对象都已经追踪到了