本文首發於公眾號:javaadu 簡單介紹 構建高性能的Java應用過程中,必然會遇到各種各樣的問題,像CPU飆高、記憶體泄漏、應用奔潰,以及其他疑難雜症,這時可以使用Serviceability Agent(SA)。SA是JDK提供的一個強大的調試工具集,適用於語言層和虛擬機層,支持調試運行著的Ja ...
本文首發於公眾號:javaadu
簡單介紹
構建高性能的Java應用過程中,必然會遇到各種各樣的問題,像CPU飆高、記憶體泄漏、應用奔潰,以及其他疑難雜症,這時可以使用Serviceability Agent(SA)。SA是JDK提供的一個強大的調試工具集,適用於語言層和虛擬機層,支持調試運行著的Java進程、core文件和虛擬機crash之後的dump文件。
SA的優點:可以呈現出類對象、能夠識別出Java堆、堆邊界、堆內對象、載入的類描述、棧記憶體、線程狀態等信息。
安裝
首先,我使用的操作系統版本是:macOS 10.12.6進。SA提供了兩個調試工具:圖形化的調試工具(HSDB)和命令行工具(CLHSDB)。這裡我們演示下如何在Mac下啟動SA HSDB。
- 設置JAVA_HOME變數:export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/
- SA HSDB的入口在$JAVA_HOME/lib/sa-jdi.jar中,main方法在sun.jvm.hotspot.HSDB中,因此使用命令:sudo java -cp $JAVA_HOME/lib/sa-jdi.jar sun.jvm.hotspot.HSDB,就可以啟動HSDB調試器(入下圖所示)
使用模式
單擊左上角的File按鈕可以看到:下拉框里指出了SA HSDB的三種使用模式:
- 鏈接到本地Hotspot進程上;
- 鏈接到core文件;
- 連接到遠程的伺服器進行Debug;
入門示例
這裡我以自己維護的一個Java應用為例,演示了SA HSDB最重要的一些功能。我在本地啟動了該服務,使用jps -l
命令可以看到該服務的PID是51926,我使用第一種調試模式。
SA是快照調試器,因此,當在上圖中點擊OK的時候,account的Java進程會被暫停,直到我們斷開對該進程的調試,而SA HSDB顯示的則是SA剛剛鏈接上account進程那個時間點的進程快照,入下圖所示。
常用工具
左側的下拉列表主要是一些常用的工具,分別介紹如下【其他功能暫時不常用,可以遇到問題了再研究】:
類瀏覽器(Class Browser):可以查看account的Java進程中載入的類;遇到OOM異常時,可以使用這個工具分析有哪些類是不需要載入的,當然,也可以分析希望載入但是沒載入的情況;
死鎖檢測(Deadlock Detection):檢測Java代碼層面的死鎖,如果線程中存在死鎖,則會顯示線程死鎖的信息和他們等待的鎖;
對象檢視器(Interceptor):可以查看Java線程對象的基本信息,也可以查看虛擬機內部的C++結構體信息;
對象直方圖(Object Histogram):可以查看當前堆記憶體中對象的直方圖,該工具在排查記憶體泄漏和OOM類問題的時候非常有效
快捷圖標
右側的小視窗上面有四個圖表,是一些快捷方式;分別介紹如下:
進程檢視器:給出線程對象的VM中間表示形式(即開發者可以看懂的格式)
棧記憶體:顯示選中進程的棧記憶體數據
- 左起第1欄是記憶體地址,請讓我提醒一下本文里提到“記憶體地址”的地方都是指虛擬記憶體意義上的地址,不是“物理記憶體地址”,請不要弄混了這倆概念;
- 第2欄是該地址上存的數據,以字寬為單位,本文例子中我是在macOS上跑64位的JDK8的HotSpot VM,字寬是64位(8位元組);
- 第3欄是對數據的註釋,豎線表示範圍,橫線或斜線連接範圍與註釋文字
棧調用路徑:顯示線程的調用路徑,可以看到方法名和地址,並能超鏈到方法的詳細信息
線程的基本信息:包括線程狀態、線程ID等等
SA的其他工具
- FinalizerInfo:該工具可用於列印出目標虛擬機所有可銷毀對象的詳細信息;
- HeapDumper:該工具可以用hprof格式轉儲Java堆的快照信息(類似於jmap命令);
- 永生代信息統計(PermStat):該工具用於列印出目標虛擬機中永生代的統計信息;Obje
- PMap:該工具用於列印出目標虛擬機進程的記憶體映射信息;
- 對象直方圖(Object Histogram):對象直方圖不僅可以在HSDB和CLHSDB中使用,還可以單獨使用;
- OQL:該工具提供了類似腳本語言的命令,可以通過執行結構化對象查詢語句,可以像寫SQL一樣,在Java堆中查找指定的對象;
- ClassDump:使用該工具可以導出目標虛擬機進程載入的類。
參考資料
- 《Java性能調優指南》
- Java ServiceabilityAgent(HSDB)使用和分析
- 借HSDB來探索HotSpot VM的運行時數據
- Java七武器系列長生劍 -- Java虛擬機的顯微鏡 Serviceability Agent
本號專註於後端技術、JVM問題排查和優化、Java面試題、個人成長和自我管理等主題,為讀者提供一線開發者的工作和成長經驗,期待你能在這裡有所收穫。