HotSpot(七)——HSDB查看内存布局

HSDB


Hotspot DebuggerJDK自带的工具,用于查看 JVM运行时的状态。每个版本 JDK都带有 HSDB功能,在 JDK9以前没有 .exe程序,需要命令打开 HSDB。之后版本就出现 JHSDB.exe,它在 bin目录下。本文是在 JDK16环境中。每个版本 JDKHSDB功能有细微差异,也有不少的 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
HotSpot(七)——HSDB查看内存布局

查看Class类内存布局

终端输入jhsdb hsdb --pid 24812,成功连接上HSDB,点击Tools打开Class Browser搜索框搜索类名,出现符合了类信息。
HotSpot(七)——HSDB查看内存布局
把对应的内存地址拿到Inspector中检索出InstanceKlass内存布局,注意OopHandle它持有正真_java_mirror的访问句柄。垃圾回收时对象可能被移动(对象地址发生改变),通过Handle访问对象可以对使用者屏蔽垃圾回收细节。
HotSpot(七)——HSDB查看内存布局
InstanceKlass的关于Filed的一些属性。
HotSpot(七)——HSDB查看内存布局

查看OOP对象内存布局

  1. hsdb> universe
  2. scanoops
  3. inspector
    HotSpot(七)——HSDB查看内存布局

Class对象

查看Class对象OopHandle中句柄对象的地址0x000002007ccb1088放到Memory Viewer中查看,获取它之后的地址就是Class对象的。把对应地址放到Inspector查看Class对象的内存布局。静态变量也在其上。
HotSpot(七)——HSDB查看内存布局

上一篇:虚拟机:对象的创建(HotSpot)


下一篇:java -XX:+PrintCommandLineFlags -version 输出结果解析