JVM利器:Serviceability Agent介紹

来源:https://www.cnblogs.com/javaadu/archive/2019/04/16/10720762.html
-Advertisement-
Play Games

本文首發於公眾號: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。

  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異常時,可以使用這個工具分析有哪些類是不需要載入的,當然,也可以分析希望載入但是沒載入的情況;

    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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • IOC:控制反轉(Inversion of Control,英文縮寫為 IOC) 簡單來講就是把代碼的控制權從調用方(用戶)轉變成被調用方(服務端) 以前的代碼控制權在調用方,所以要每當程式要更新修改功能時,一定要大量修改調用方的代碼才行,工程量大,維護麻煩。 後來有了IOC,可以將所有的功能模塊交 ...
  • What 本篇應該是穩定性「三十六計」系列的一篇:超時重試。但是「設置預設的超時和重試是一個基礎設施的基本素養」這句話我在我們組內三次開會的時候都說了。表達了我的一個理念。 Why 為什麼一個基礎設施要設置預設的超時和重試?想象下麵一個場景。 TCP協議里有一些基本的概念:MSL、TTL、RTT。 ...
  • 第一次寫文章 很粗略 請多多指教 有什麼疑問或者問題歡迎發郵件給我 [email protected] 鏈接:http://note.youdao.com/noteshare?id=ea9b9d16c549d6ddc827dd2e70c185b1&sub=B5DEED2633F242309ECEA96 ...
  • [TOC] 介紹 初學Java虛擬機幾天, 被方法區, 永久代這些混雜的概念搞混了. 我覺得學習這部分知識應該把官方定義的虛擬機運行時數據區域和虛擬機記憶體結構分開敘述, 要不然容易誤導. 本文先介紹官方文檔規定的運行時數據區域, 然後以JDK1.8的HotSpot虛擬機為例, 介紹虛擬機的記憶體結構. ...
  • php概述 什麼是php,PHP語言的優勢,PHP5的新特性,PHP的發展趨勢,PHP的應用領域。 PHP是超文本預處理器,是一種伺服器端,跨平臺,HTML嵌入式的腳本語言,具有c語言,Java語言,和Perl語言的特點,是一種被廣泛應用的開源式的多用途腳本語言,適合web開發。 PHP是b/s體系 ...
  • 1 數組也是一種類型 Java中要求所有的數組元素具有相同的數據類型。因此在一個數組中,數組元素的類型是唯一的,不能存儲多種類型的數據。 一旦數組的初始化完成,數組在記憶體中所占的空間將被固定下來,因此數組的長度不可以被改變。即使某個數組元素的數據被清空,他占的空間依然被保留,依然屬於該數組,數組的長 ...
  • 一、概述 當我們打開一個SqlSession的時候,我們就完成了操作資料庫的第一步,那MyBatis是如何執行Sql的呢?其實MyBatis的增刪改查都是通過Executor執行的,Executor和SqlSession綁定在一起,由Configuration類的newExecutor方法創建。 二 ...
  • 在很多時候,我們代碼中會有很多分支,而且分支下麵的代碼又有一些複雜的邏輯,相信很多人都喜歡用 if-else/switch-case 去實現。做的不好的會直接把實現的代碼放在 if-else/switch-case 的分支之下: 這樣的代碼不僅冗長,讀起來也非常困難。做的好一點的會把這些邏輯封裝成函 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...