jhsdb:基于服务性代理的调试工具

Laughing
2025-04-20 / 0 评论 / 12 阅读 / 搜一下 / 正在检测是否收录...
温馨提示:
本文最后更新于2025年04月20日,已超过68天没有更新,若内容或图片失效,请留言反馈。

JHSDB是一款基于服务性代理实现的进程外调试工具。服务性代理是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的API集合。通过服务性代理,可以在一个独立的Java虚拟机进程里分析其他HotSpot虚拟机的内部数据,或者从HotSpot虚拟机进程内存中dump出来的转出快照里还原出虚拟机当时的运行状态细节。

下面我们通过实际代码演示一下JHSDB常见的使用命令。

壹、准备演示代码

public class JHSDB_TestCase {

    static class ObjectHolder {
    }

    static class Test {

        static ObjectHolder staticObjectHolder = new ObjectHolder();

        ObjectHolder instanceObjectHolder = new ObjectHolder();

        void foo() {
            ObjectHolder localObjectHolder = new ObjectHolder();
            System.out.println("done");
        }

    }

    public static void main(String[] args) {
        Test test = new Test();
        test.foo();
    }
}

贰、查看VMID

为了查看虚拟机信息,我们需要先知道虚拟机的进程ID,我们通过下面的命令查看VMID

jps -l

叁、jhsdb常见使用命令

一、hsdb

jhsdb hsdb命令用于打开可视化可视化监控页面

jhsdb hsdb命令格式如下

jhsdb hsdb <pid>

打开可视化界面

jhsdb hsdb --pid 19825

m9pgnexw.png

 二、jmap

jmap命令用于生成堆转储快照,与JDK自带的jmap命令类似。

jhsdb jmap命令格式如下

jhsdb jmap [--pid pid | --exe executable --core coredump] [options]

其中options包括

  • --heap to print java heap summary //显示Java堆详细信息
  • --binaryheap to dump java heap in hprof binary format
  • --dumpfile name of the dump file //导出 Java 虚拟机堆的快照,生成文件
  • --histo to print histogram of java object heap //打印 Java 对象堆的直方图
  • --clstats to print class loader statistics //打印 Java 堆的类加载器统计信息
  • --finalizerinfo to print information on objects awaiting finalization //打印有关等待完成的对象的信息

    查看堆栈信息

jhsdb jmap --pid 14383 --heap

m9pdm5dd.png

转储堆栈快照

除了查看堆栈信息,我们也可以转储堆栈信息。

jhsdb jmap --pid 14383 --binaryheap --dumpfile /users/lisen/downloads/heap.bin

m9pe0ocj.png

查看class信息

可以查看instances(实例数)、bytes(大小)、class name(类名)等信息

jhsdb jmap --pid 14383 --histo

m9pe5oxq.png

 三、jinfo

jinfo命令用于实时查看和修改虚拟机各项参数。

jhsdb jmap命令格式如下

jhsdb jinfo <option> <pid>

其中option包括以下内容

  • flags:查看所有虚拟机参数
  • sysprops:查看Java系统属性值

输出虚拟机参数

jhsdb jinfo --pid 14383 --flags

image-20250420171537688

输出Java系统属性

jhsdb jinfo --pid 14383 --sysprops

image-20250420172844538

 四、jsnap

jsnap打印性能计数器信息。

jhsdb jsnap 命令格式如下

jhsdb jnap <option> <pid>

打印性能计数信息

jhsdb jsnap --pid 14383 

image-20250420173201420

 五、jstack

jhsdb jstack打印线程信息

jhsdb jstack命令格式如下

jhsdb jstack <pid> <option>

其中option包括以下内容

  • locks:打印线程信息
  • mixed:尝试打印Java栈与本地方法栈的信息(需操作系统支持)

打印锁信息

jhsdb jstack --locks --pid 14383

image-20250420173731194

0

评论 (0)

取消