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对象的内存布局。静态变量也在其上。