HotSpot(七)——HSDB查看内存布局教程
HSDB
Hotspot Debugger
是 JDK
自带的工具,用于查看 JVM
运行时的状态。每个版本 JDK
都带有 HSDB
功能,在 JDK9
以前没有 .exe
程序,需要命令打开 HSDB
。之后版本就出现 JHSDB.exe
,它在 bin
目录下。本文是在 JDK16
环境中。每个版本 JDK
的 HSDB
功能有细微差异,也有不少的 bug
。我用的 jdk1.8
最新版本,用 scanoops
直接返回空白。用 jdk16
,没有了 mem
命令很不方便。
JHSDB
它是对各种基础功能的整合。
jhsdb clhsdb [--pid pid | --exe executable --core coredump]
jhsdb debugd [options] pid [server-id]|[option] executable core [server-id]
jhsdb hsdb [--pid pid | --exe executable --core coredump]
jhsdb jstack [--pid pid | --exe executable --core coredump] [options]
jhsdb jmap [--pid pid | --exe executable --core coredump] [options]
jhsdb jinfo [--pid pid | --exe executable --core coredump] [options]
jhsdb jsnap [options] [--pid pid | --exe executable --core coredump]
JHSDB使用
Demo
public class DemoApplication {
public String as;
public Student st;
private static int num = 18;
public final String str = "Hello test";
public static void main(String[] args) {
DemoApplication ts = new DemoApplication();
System.out.println();
}
}
查看进程号
在打印处断点,debug
运行main()
方法。控制台Terminal
输入命令jps -l
查看Class类内存布局
终端输入jhsdb hsdb --pid 24812
,成功连接上HSDB
,点击Tools
打开Class Browser
搜索框搜索类名,出现符合了类信息。
把对应的内存地址拿到Inspector
中检索出InstanceKlass
内存布局,注意OopHandle
它持有正真_java_mirror
的访问句柄。垃圾回收时对象可能被移动(对象地址发生改变),通过Handle访问对象可以对使用者屏蔽垃圾回收细节。
InstanceKlass
的关于Filed
的一些属性。
查看OOP对象内存布局
hsdb> universe
scanoops
inspector
Class对象
查看Class对象
将OopHandle
中句柄对象的地址0x000002007ccb1088
放到Memory Viewer
中查看,获取它之后的地址就是Class对象的。把对应地址放到Inspector
查看Class对象的内存布局。静态变量也在其上。