JHSDB使用
JHSDB 是一款基于服务性代理实现的进程外调试工具。服务性代理是HotSpot 虚拟机中一组用于映射Java 虚拟机运行信息的,主要基于Java 语言实现的API 集合。
一、打开JHSDB
打开JDK所在目录(一般默认装在c盘),保证在JDK的bin目录下也存在sawindbg.dll
,没有的话可以从jre目录下面复制一份过来,只要保证两个文件夹都有就行了。
在JDK的lib目录下Shift+右键
点击在此处打开Powershell窗口
。
在命令行中输入以下代码就可以开启了(可能需要等待个三秒左右)。
java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB
二、设置参数
代码如下:
public class Student {
private String name;
private String gender;
private int age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getGender() { return gender; }
public void setGender(String gender) { this.gender = gender; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public static void main(String[] args) throws Exception {
//启动程序添加JVM参数 -XX:+UseConcMarkSweepGC -XX:-UseCompressedOops
Student student = new Student();
student.setName("王二狗");
student.setGender("男");
student.setAge(35);
for (int i = 0; i < 15; i++) {
System.gc();//主动发起 GC 15次
}
Student student1 = new Student();
student1.setName("张三丫");
student1.setGender("女");
student1.setAge(25);
Thread.sleep(Long.MAX_VALUE);
}
}
启动程序添加JVM参数:
官方JVM参数详解:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
-Xms30m -Xmx30m -Xss1m -XX:MaxMetaspaceSize=30m -XX:+UseConcMarkSweepGC -XX:-UseCompressedOops
三、监听进程
打开cmd
或者之前已经打开的Powershell
输入jps
指令回车,可以看到启动的进程ID。
下一步~~
弹出以下页面表示成功。
四、相关参数查看
选中main
线程,选择Tools
中的Heap Parameters
可以查看堆中的信息。在这可以看到堆的分区以及对应的内存地址范围。
选择Tools
中的Object Histogram
可以看到方法区里的所有class,这里的查询是按照全局限定名来查询的,双击可以看到创建的两个对象。
随便选择一个对象,点击Inspect
可以看到对象的相关属性,此时就可以看到之前创建的对象了。
选中main线程,点击StackMemory可以查询到栈中的信息,从这里也可以看到本地方法栈和虚拟机栈在Hotspot合二为一了。