1.JHSDB簡介
JHSDB是一款基於服務性代理實現的進程外調試工具。服務性代理是HotSpot虛擬機中一組用於映射Java虛擬機運行信息的,主要基於Java語言實現的API集合。
2.JHSDB啟動
2.1 啟動示例代碼
package com.ryj.hotspot; import java.io.IOException; import org.omg.CORBA.ObjectHolder; public class JHSDB_Test { static class Test { static ObjectHolder staticObj = new ObjectHolder(); ObjectHolder instanceObj = new ObjectHolder(); void foo() { ObjectHolder localObject = new ObjectHolder(); while (true) { try { Thread.sleep(6000 * 1000l); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public static void main(String[] args) { Test test = new JHSDB_Test.Test(); test.foo(); } }
2.2 找到java進程號
C:\Program Files\Java\jdk1.8.0_144\bin>jps -l 8400
2.3 啟動JHSDB
C:\Program Files\Java\jdk1.8.0_144\lib>java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB
如果出現報錯信息,需要將缺少的文件移動到該lib目錄下
2.4 在打開的窗口中輸入進程號
- Inspector:查看 OOP 和 Klass 對象信息,雙擊線程名稱也能夠查看此信息
- Stack Memory:線程棧內存
- Show Java Stack Traces:顯示線程堆棧信息
- Show Thread Infomation:顯示線程信息
- Find Crashes
3.JHSDB實戰
3.1 查看堆信息
可以通過Tools -> Heap Parameters 查看或通過Windows -> Console執行命令
hsdb> universe Heap Parameters: ParallelScavengeHeap [ PSYoungGen [ eden = [0x00000000d5d80000,0x00000000d5f73368,0x00000000d7e00000] , from = [0x00000000d8300000,0x00000000d8300000,0x00000000d8800000] , to = [0x00000000d7e00000,0x00000000d7e00000,0x00000000d8300000] ] PSOldGen [ [0x0000000081800000,0x0000000081800000,0x0000000086d80000] ] ]
3.2 查找對象內存地址
hsdb> scanoops 0x00000000d5d80000 0x00000000d8800000 com.ryj.hotspot.JHSDB_Test$ObjectHolder
由於本地環境 scanoops命令報錯,后續參考 https://www.bilibili.com/video/av95220376/