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合二為一了。