HSDB,javahsdb
HSDB 是專門用於調試 HotSpot VM 的調試器,它是一個圖形化界面。與之對應的還有個 CLHSDB-Command Line HotSpot Debugger,命令行調試界面。下面是啟動命令:
java -cp .;%JAVA_HOME%/lib/sa-jdi.jar sun.jvm.hotspot.HSDB # 啟動圖形界面
java -cp .;%JAVA_HOME%/lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB # 啟動命令行界面
1. HSDB 圖形界面
啟動 HSDB 後,使用 File -> Attach to HotSpot process 連接到目標進程:
連接成功後,默認打開 Java Threads 界面,雙擊一個線程可查看其 OOP 信息,或者使用工具欄工具,如下:
- Inspector:查看 OOP 和 Klass 對象信息,雙擊線程名稱也能夠查看此信息
- Stack Memory:線程棧內存
- Show Java Stack Traces:顯示線程堆棧信息
- Show Thread Infomation:顯示線程信息
- Find Crashes
(1)Inspector
(2)Stack Memory
棧內存界面有 3 欄信息,從左到右依次是:內存地址,指虛擬地址不是物理地址;該地址數據,以字寬為單位,如下圖是在64位的機器的情況,字寬就是64位=8字節;相關注釋,豎線表示范圍,橫線表示說明。
Tools 工具欄也變得可用,主要有以下功能:
- Class Browser:類浏覽器
- Code Viewer: 代碼查看
- Compute Reverse Ptrs:反向指針計算
- Deadlock Detection: 死鎖探測
- Find Object by Query: 使用對象查詢語言查詢對象
- Find Pointer:查找指針
- Find Value in Heap:在堆中查詢
- Find Value in Code Cache:在Code Cache 中查詢
- Heap Parameters:堆信息
- Inspector:對象檢查器
- Memory Viewer: 內存信息
- Monitor Cache Dump:監控Cache信息
- Object Histogram: 對象直方圖
- Show System Properties:顯示系統屬性
- Show VM Version:顯示 VM 版本
- Show –XX flags:顯示 VM 選項
使用 Heap Parameters 查看堆信息,能夠查看出各代的地址空間:
2. CLHSDB
既可以在 HSDB 中使用 Windows –> Console 進行命令行界面,也可以使用 Java 命令直接連接到 CLHSDB 如圖:
CLHSDB 提供了豐富的命令,使用 help 查看幫助信息,以下簡單介紹常用的命令:
-
attach pid|exec core:連接 Java進程或 core文件
-
class name:查看類信息
-
classes:查看加載的類
-
detach:斷開連接
-
inspect expression:查看 OOP 信息
-
jstack [-v]:線程堆棧
-
mem address [length]:查看內存
-
print expression:輸出表達式值
-
revptrs:反向指針
-
scanoops start end [type]:掃描指定空間中的 type 類型及其子類的實例
-
thread {-a|id}:查看指定線程信息
-
threads:查看所有線程信息
-
universe:查看堆空間信息
-
whatis address:查看指定地址存放的數據信息
-
quit:退出
通過 HSDB和CLHSDB 可以查看 JVM 內部信息,從本質上去了解 JVM 的工作原理。