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
在这里插入图片描述

查看Class类内存布局

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


查看OOP对象内存布局

  1. hsdb> universe
  2. scanoops
  3. inspector
    在这里插入图片描述

Class对象

查看Class对象OopHandle中句柄对象的地址0x000002007ccb1088放到Memory Viewer中查看,获取它之后的地址就是Class对象的。把对应地址放到Inspector查看Class对象的内存布局。静态变量也在其上。
在这里插入图片描述

标签: 内存, pid, exe, core, Class, HSDB, HotSpot, jhsdb

相关文章推荐

添加新评论,含*的栏目为必填