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

JVM 調優總結(十):調優工具與實戰方法論

     編輯:Java 相關知識

主流調優工具

工具特點
JConsoleJDK 自帶、輕量、適合生產環境、GC 詳情豐富
JProfiler商業收費、功能最強、CPU/內存/線程全維度分析
VisualVMJDK 自帶、免費開源、功能接近 JProfiler、**首選推薦**

核心分析維度

1. 堆信息與 GC 監控

  • **空間分配**:新生代/老年代/永久代/元空間大小、使用率趨勢。
  • **即時 GC**:手動觸發 Full GC 驗證回收效果。
  • **長時間監控**:觀察 GC 後內存「谷底」連線——**持續上升 = 內存洩漏**。

2. 類/對象統計與引用鏈

  • **活躍對象計數/大小**:定位佔用內存最大的類(如集合、緩存)。
  • **對象引用鏈**:追溯 GC Root → 找到洩漏對象為何不被回收(常見:靜態集合、ThreadLocal 未清理、監聽器未移除)。

3. 線程監控與死鎖檢測

  • **線程數量/狀態**:RUNNABLE、BLOCKED、WAITING、TIMED_WAITING 分布。
  • **Dump 線程快照**:分析堆棧,定位卡死、慢查詢、鎖競爭熱點。
  • **自動死鎖檢測**:一鍵識別循環等待鏈。

4. 熱點分析(CPU/內存)

  • **CPU 熱點**:哪些方法佔用最多 CPU 時間 → 優化算法、減少鎖範圍。
  • **內存熱點**:單位時間內分配最多/存活最久的對象 → 優化對象創建、啟用逃逸分析、對象池化。

5. 快照對比:精準定位洩漏

在 **GC 前後** 分別導出堆快照,對比對象數量/類型變化,**被遺漏的對象即洩漏源頭**。

四大經典 OOM 場景與解決

| 異常 | 成因 | 解決方向 | |------|------|----------| | java.lang.OutOfMemoryError: Java heap space | 老年代被不可回收對象填滿 | 快照對比 + 引用鏈定位洩漏點;或擴大堆/優化代碼 | | java.lang.OutOfMemoryError: PermGen space / Metaspace | 類加載過多(反射、動態代理、JSP、OSGi) | -XX:MaxPermSize/MaxMetaspaceSize;排查重複加載;升級 JDK/換 JRockit | | java.lang.StackOverflowError | 遞歸無出口/循環調用 | 代碼修復:改迭代、增加終止條件 | | Fatal: Stack size too small / unable to create new native thread | 線程過多/棧太大導致 OS 內存不足 | -Xss 減小棧;重構為 NIO/線程池;增加物理內存/減小堆 |

調優黃金法則

  1. **有的放矢**:先用工具定位熱點/洩漏,再優化具體代碼,勿全代碼審查。
  2. **區分洩漏與超負荷**:洩漏=用完不回收;超負荷=確實不夠用。前者修代碼,後者加資源/改架構。
  3. **記錄 GC 日志**:-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log,長期保存,趨勢分析。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved