首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JVM 卡死時查看類字段值:jstack + jmap + jhat / Arthas 線上診斷方案

     編輯:程式設計綜合問答

場景

Java 應用卡死 (死鎖、活鎖、長 GC、IO 等待),無法復現調試,需在線獲取特定類實例的字段值。

標準工具鏈

  1. jstack :獲取線程堆棧,定位卡死線程、鎖持有者、調用鏈。
  2. jmap -dump:live,format=b,file=heap.hprof :導出堆轉儲文件 (觸發 Full GC,慎用高峰期)。
  3. jhat heap.hprof 或 **Eclipse MAT (Memory Analyzer Tool)**:分析堆轉儲。
    • MAT OQL 查詢:`SELECT * FROM com.example.MyClass WHERE fieldName = 'value'`
    • 支援 Dominator Tree、Leak Suspects、Histogram 等深度分析。

現代神器:Arthas (阿里巴巴開源)

**無需導出堆轉儲,線上實時查看對象字段**,極大降低生產環境影響。


# 啟動
java -jar arthas-boot.jar
# 選擇目標進程

# 查看類加載信息
sc -d com.example.TargetClass

# 監控方法調用並觀察參數/返回值/字段 (核心功能)
watch com.example.TargetClass methodName "{params, target, returnObj, throwExp}" -x 2

# 直接查看對象字段 (需對象地址,可通過 ognl 表達式獲取)
# 示例:查看單例實例的字段
ognl "@com.example.TargetClass@INSTANCE.fieldName"

# 統計對象數量/大小
monitor -c 5 com.example.TargetClass methodName

參考資源

操作建議

  1. **首選 Arthas**:非侵入、實時、功能強大 (watch/tt/ognl/stack/thread/jvm/sysprop/heapdump)。
  2. **堆轉儲次之**:MAT 分析功能最全,適合事後深度根因分析 (內存洩漏、對象保留鏈)。
  3. **禁止生產直接 jmap -dump:live**:大堆 (>4GB) 導致長時間 STW,可能引發雪崩。改用 `-XX:+HeapDumpOnOutOfMemoryError` 或 Arthas `heapdump` (非 live 模式)。

線上診斷核心:**知曉工具邊界,選擇影響最小、信息最豐富的方式**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved