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
二、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
转储堆栈快照
除了查看堆栈信息,我们也可以转储堆栈信息。
jhsdb jmap --pid 14383 --binaryheap --dumpfile /users/lisen/downloads/heap.bin
查看class信息
可以查看instances(实例数)、bytes(大小)、class name(类名)等信息
jhsdb jmap --pid 14383 --histo
三、jinfo
jinfo
命令用于实时查看和修改虚拟机各项参数。
jhsdb jmap命令格式如下
jhsdb jinfo <option> <pid>
其中option
包括以下内容
- flags:查看所有虚拟机参数
- sysprops:查看Java系统属性值
输出虚拟机参数
jhsdb jinfo --pid 14383 --flags
输出Java系统属性
jhsdb jinfo --pid 14383 --sysprops
四、jsnap
jsnap
打印性能计数器信息。
jhsdb jsnap 命令格式如下
jhsdb jnap <option> <pid>
打印性能计数信息
jhsdb jsnap --pid 14383
五、jstack
jhsdb jstack打印线程信息
jhsdb jstack命令格式如下
jhsdb jstack <pid> <option>
其中option
包括以下内容
- locks:打印线程信息
- mixed:尝试打印Java栈与本地方法栈的信息(需操作系统支持)
打印锁信息
jhsdb jstack --locks --pid 14383
评论 (0)