場景
Java 應用卡死 (死鎖、活鎖、長 GC、IO 等待),無法復現調試,需在線獲取特定類實例的字段值。
標準工具鏈
- jstack :獲取線程堆棧,定位卡死線程、鎖持有者、調用鏈。
- jmap -dump:live,format=b,file=heap.hprof :導出堆轉儲文件 (觸發 Full GC,慎用高峰期)。
- 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
參考資源
操作建議
- **首選 Arthas**:非侵入、實時、功能強大 (watch/tt/ognl/stack/thread/jvm/sysprop/heapdump)。
- **堆轉儲次之**:MAT 分析功能最全,適合事後深度根因分析 (內存洩漏、對象保留鏈)。
- **禁止生產直接 jmap -dump:live**:大堆 (>4GB) 導致長時間 STW,可能引發雪崩。改用 `-XX:+HeapDumpOnOutOfMemoryError` 或 Arthas `heapdump` (非 live 模式)。
線上診斷核心:**知曉工具邊界,選擇影響最小、信息最豐富的方式**。