JVM利器:Serviceability Agent介紹

本文首發於公衆號:javaaduhtml

簡單介紹

構建高性能的Java應用過程當中,必然會遇到各類各樣的問題,像CPU飆高、內存泄漏、應用奔潰,以及其餘疑難雜症,這時可使用Serviceability Agent(SA)。SA是JDK提供的一個強大的調試工具集,適用於語言層和虛擬機層,支持調試運行着的Java進程、core文件和虛擬機crash以後的dump文件。java

SA的優勢:能夠呈現出類對象、可以識別出Java堆、堆邊界、堆內對象、載入的類描述、棧內存、線程狀態等信息。git

安裝

首先,我使用的操做系統版本是:macOS 10.12.6進。SA提供了兩個調試工具:圖形化的調試工具(HSDB)和命令行工具(CLHSDB)。這裏咱們演示下如何在Mac下啓動SA HSDB。github

  1. 設置JAVA_HOME變量:export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/
  2. 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調試器(入下圖所示)

2017-12-1421.24.53.png

使用模式

單擊左上角的File按鈕能夠看到:下拉框裏指出了SA HSDB的三種使用模式:面試

  1. 連接到本地Hotspot進程上;
  2. 連接到core文件;
  3. 鏈接到遠程的服務器進行Debug;

2017-12-1421.24.44.png

入門示例

這裏我以本身維護的一個Java應用爲例,演示了SA HSDB最重要的一些功能。我在本地啓動了該服務,使用jps -l命令能夠看到該服務的PID是51926,我使用第一種調試模式。後端

2017-12-1422.10.09.png

SA是快照調試器,所以,當在上圖中點擊OK的時候,account的Java進程會被暫停,直到咱們斷開對該進程的調試,而SA HSDB顯示的則是SA剛剛連接上account進程那個時間點的進程快照,入下圖所示。瀏覽器

2017-12-1422.16.52.png

經常使用工具

左側的下拉列表主要是一些經常使用的工具,分別介紹以下【其餘功能暫時不經常使用,能夠遇到問題了再研究】:服務器

  1. 類瀏覽器(Class Browser):能夠查看account的Java進程中載入的類;遇到OOM異常時,可使用這個工具分析有哪些類是不須要載入的,固然,也能夠分析但願載入可是沒載入的狀況;jvm

    2017-12-1422.48.50.png

  2. 死鎖檢測(Deadlock Detection):檢測Java代碼層面的死鎖,若是線程中存在死鎖,則會顯示線程死鎖的信息和他們等待的鎖;工具

  3. 對象檢視器(Interceptor):能夠查看Java線程對象的基本信息,也能夠查看虛擬機內部的C++結構體信息;

    2017-12-1422.50.11.png

  4. 對象直方圖(Object Histogram):能夠查看當前堆內存中對象的直方圖,該工具在排查內存泄漏和OOM類問題的時候很是有效

    2017-12-1422.45.11.png

快捷圖標

右側的小窗口上面有四個圖表,是一些快捷方式;分別介紹以下:

  1. 進程檢視器:給出線程對象的VM中間表示形式(即開發者能夠看懂的格式)

  2. 棧內存:顯示選中進程的棧內存數據

    2017-12-1421.48.43.png

    • 左起第1欄是內存地址,請讓我提醒一下本文裏提到「內存地址」的地方都是指虛擬內存意義上的地址,不是「物理內存地址」,請不要弄混了這倆概念;
    • 第2欄是該地址上存的數據,以字寬爲單位,本文例子中我是在macOS上跑64位的JDK8的HotSpot VM,字寬是64位(8字節);
    • 第3欄是對數據的註釋,豎線表示範圍,橫線或斜線鏈接範圍與註釋文字
  3. 棧調用路徑:顯示線程的調用路徑,能夠看到方法名和地址,並能超鏈到方法的詳細信息

  4. 線程的基本信息:包括線程狀態、線程ID等等

SA的其餘工具

  1. FinalizerInfo:該工具可用於打印出目標虛擬機全部可銷燬對象的詳細信息;
  2. HeapDumper:該工具能夠用hprof格式轉儲Java堆的快照信息(相似於jmap命令);
  3. 永生代信息統計(PermStat):該工具用於打印出目標虛擬機中永生代的統計信息;Obje
  4. PMap:該工具用於打印出目標虛擬機進程的內存映射信息;
  5. 對象直方圖(Object Histogram):對象直方圖不只能夠在HSDB和CLHSDB中使用,還能夠單獨使用;
  6. OQL:該工具提供了相似腳本語言的命令,能夠經過執行結構化對象查詢語句,能夠像寫SQL同樣,在Java堆中查找指定的對象;
  7. ClassDump:使用該工具能夠導出目標虛擬機進程加載的類。

參考資料

  1. 《Java性能調優指南》
  2. Java ServiceabilityAgent(HSDB)使用和分析
  3. 借HSDB來探索HotSpot VM的運行時數據
  4. Java七武器系列長生劍 -- Java虛擬機的顯微鏡 Serviceability Agent

本號專一於後端技術、JVM問題排查和優化、Java面試題、我的成長和自我管理等主題,爲讀者提供一線開發者的工做和成長經驗,期待你能在這裏有所收穫。
javaadu

相關文章
相關標籤/搜索