首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Core Dump 與 Heap Dump 深度剖析:生成時機、工具鏈、執行緒堆疊與記憶體洩漏診斷實戰

     編輯:Java 相關知識

JVM 診斷雙核心藍圖:Java Core Dump 與 Heap Dump 完整指南

生產環境 JVM 故障診斷,javacore (Thread Dump) 與 heapdump 是兩大核心藍圖。前者聚焦 CPU/執行緒狀態,後者聚焦記憶體/物件分佈。本文系統解析生成時機、獲取方法、分析工具與實戰診斷流程。

核心差異定位

維度Java Core Dump (javacore.txt)Heap Dump (heapdump.phd)
核心關注CPU、執行緒、鎖、堆疊記憶體、物件、類、GC 根
檔案格式文本 (可直接閱讀)二進制 (需專用工具)
檔案大小小 (KB~MB)大 (GB 級,約等於 Heap 大小)
生成觸發SIGQUIT (kill -3)、OutOfMemoryError、手動 APIOutOfMemoryError、手動 API、JMap
主要用途死鎖、CPU 飆高、卡頓、無回應記憶體洩漏、OOM 原因、物件保留路徑
分析工具編輯器、IBM Thread Monitor、fastThread、TDAEclipse MAT、IBM Heap Analyzer、JHat、JVisualVM

生成方法大全

Linux/Unix 環境

# 1. 找出 Java 進程 PID
ps -ef | grep java
# 範例輸出: root 5580 1 0 Oct27 ? 00:02:27 /usr/bin/java -server ...

# 2. 發送 SIGQUIT 信號 (產生 javacore + 可能 heapdump)
kill -3 5580

# 3. 間隔 10-30 秒再發送一次 (對比兩份 javacore 找卡點)
sleep 20
kill -3 5580

# 4. 指定輸出目錄 (IBM JVM)
# -Xdump:java:defaults:file=/path/to/javacore.txt
# -Xdump:heap:defaults:file=/path/to/heapdump.phd

通用工具生成 (HotSpot/OpenJDK)

# jstack - 執行緒堆疊 (相當於 javacore)
jstack -l  > thread_dump.txt
jstack -F  > thread_dump.txt  # 強制模式 (進程掛起時)

# jmap - 堆轉儲
jmap -dump:live,format=b,file=heapdump.hprof   # 只存活物件
jmap -dump:format=b,file=heapdump.hprof        # 全部物件

# jcmd - 診斷命令工具 (JDK 7+)
jcmd  Thread.print > thread_dump.txt
jcmd  GC.heap_dump heapdump.hprof

程式碼觸發

// 1. 觸發 Thread Dump (HotSpot)
ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);

// 2. 觸發 Heap Dump (需 com.sun.management.HotSpotDiagnosticMXBean)
HotSpotDiagnosticMXBean mxbean = ManagementFactory.newPlatformMXBeanProxy(
    ManagementFactory.getPlatformMBeanServer(),
    "com.sun.management:type=HotSpotDiagnostic",
    HotSpotDiagnosticMXBean.class);
mxbean.dumpHeap("/path/heapdump.hprof", true); // live=true

JVM 參數自動生成

# OOM 時自動生成
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/dumps/heapdump.hprof

# IBM JVM 參數
-Xdump:heap:events=systhrow,filter=java/lang/OutOfMemoryError
-Xdump:java:events=systhrow,filter=java/lang/OutOfMemoryError

Java Core Dump 實戰分析流程

  1. 定位當前執行緒:搜尋 Current Thread Details 或 1XHCURRENTTHD (IBM) / "main" #1 (HotSpot)
  2. 提取堆疊追蹤:4XESTACKTRACE (IBM) 或 at com.xxx.Class.method (HotSpot)
  3. 雙份對比法:間隔獲取兩份,尋找相同執行緒停留在相同程式碼行 → 疑似卡點
  4. 關鍵字過濾:
    • BLOCKED / WAITING → 鎖爭用、等待資源
    • RUNNABLE + I/O → 磁碟/網路慢
    • Object.wait() / Thread.join() / Thread.sleep() → 正常等待或卡住
    • java.lang.OutOfMemoryError 在標題 → 直接看 Heap Dump

Heap Dump 記憶體洩漏診斷實戰 (Eclipse MAT)

  1. 開啟 .hprof/.phd:File → Open Heap Dump
  2. Histogram 視圖:按 Retained Heap 大小排序,找佔用大戶
  3. Dominator Tree:看物件保留樹,找 GC Root 到大物件的路徑
  4. Leak Suspects Report:自動分析報告,直指疑似洩漏點
  5. OQL 查詢:精準定位
    -- 找超過 10MB 的集合
    SELECT * FROM java.util.ArrayList WHERE (toHexString(size) >= 1000000)
    
    -- 找特定類別實例保留路徑
    SELECT * FROM com.myapp.CacheEntry

常見問題模式識別

現象Core Dump 特徵Heap Dump 特徵典型原因
CPU 100%多執行緒 RUNNABLE、堆疊在計算/正則/序列化無特徵死迴圈、低效演算法、GC 狂轉
應用無回應執行緒 BLOCKED/WAITING、同一鎖/資源可能正常死鎖、連線池耗盡、外部服務超時
OOM: Java Heap標題含 OOM大量特定類實例、集合無限增長快取無清理、集合未釋放、記憶體洩漏
OOM: Metaspace標題含 OOM大量 Class/ClassLoader類加載器洩漏、動態生成類過多
GC 頻繁/停頓長VM Thread/GC Thread 活躍大量短命物件、老年代碎片分配率高、大物件、Heap 太小

最佳實務建議

  • 常態化收集:定時 jstack、jmap 建立基準線
  • 自動化分析:CI/CD 整合 fastThread、MAT 命令列分析
  • 敏感資料清理:Heap Dump 含業務數據,分析前脫敏、分析後銷毀
  • 工具版本匹配:MAT 版本支援對應 JDK 版本 (如 JDK 17 需 MAT 1.12+)
  • 雲原生適配:K8s 環境用 kubectl exec 進容器生成、Sidecar 定期收集

掌握雙 Dump 獲取、分析工具鏈、模式識別,是 JVM 故障從「有感覺」到「有證據」的關鍵能力躍升。

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