一、前言
- 開發Java項目過程中,難免會碰到一些 性能 問題,這時候就需要一些工具,幫忙排查
- 本文主要介紹 JDK自帶的上古神器 jstat、jmap,用於分析內存問題,另簡單介紹 MAT、gceasy、HeapDump 等
- 以 openjdk 11.0.13、G1 垃圾收集器、Linux系統 為例
二、GC分析:jstat
1. jstat 簡介
- jstat 全稱 “Java Virtual Machine statistics monitoring tool”,位於 JDK 的 bin 目錄下,用於對 Java 程序的資源和性能進行監控,包括 Heap size、垃圾回收狀況 等。
- jstat --help:查看命令幫助
- jstat -options:返回有哪些命令選項,如 -gcutil、-gc、-gccapacity、-gccause,另有 -class、-compiler、-printcompilation 等
jstat 上一步輸出的命令選項 [-t] [-h每幾行輸出標題行] 進程號 [持續輸出間隔時長 [輸出次數]]- 持續輸出間隔時長 默認毫秒,數字後面加
s單位改為秒,-t表示每行開頭輸出 相對應用啓動時間的Timestamp 時間戳
2. jstat -gcutil
- 常用命令格式:jstat -gcutil 進程號 持續輸出間隔毫秒數,下圖每隔 1000毫秒輸出一次
- 前6列 輸出各個內存區域使用百分比 (沒有容量大小),依次是 倖存區survivor0、1、新生代Eden、老年代Old、元數據 Metaspace、Compressed class space
- GC 結尾的列 表示 GC次數,GCT 結尾的 表示 GC耗時,依次是 Young GC 次數和耗時、Full GC、Compressed class space GC,最後一列 GCT 是 Total總GC耗時
- 2次相鄰的GC,可以快速判斷那一次GC的耗時;GCT / GC = 平均每次GC耗時
- GC是否頻繁標準參考:Young GC執行迅速(50毫秒以內)、Young GC執行不頻繁(間隔10秒左右一次)、Full GC執行迅速(1秒以內)、Full GC執行不頻繁(間隔10分鐘左右一次)
3. jstat -gc
- 列出 各區域的容量Capacity、使用大小 Utilization,單位是 KB,有容量大小,沒有百分比
- YGC 開始,是各區域 GC次數、耗時
4. jstat -gccapacity
- 主要關注 各區域 最小(Min,MN結尾)、最大(Max,MX結尾)、當前(Capacity,C結尾) 容量 capacity
- 最後3列 YGC、FGC、CGC 分別是 Young、Full、Compressed class space 區域 GC次數
- NGCMN 是 新生代最小容量 new generation capacity min
- 各個分區的容量,單位是 KB
三、內存分析:jmap
1. jmap 簡介
jmap 可以 快速分析簡單的內存佔用,生成 dump文件 便於後續分析
2. jmap -histo
- 快速檢測明顯的內存問題(看不出來問題,可以下一步 jmap -dump)
- 命令格式:jmap -histo 進程號,建議後面加
| head -行數,不然就等着刷屏吧
3. jmap -dump
- 生成的文件,用於深層次分析內存問題
- 命令格式:
jmap -dump:format=b,file=heap.bin <pid> - GC以後再 dump,可以確定是不是還沒有觸發GC,內存佔用才高,格式是在
-dump:後面增加live, - dump文件如果在服務器,建議壓縮以後在傳輸,如下圖 文件大小降低70%
- 如果是在遠程容器裏面,下載到本地可能報錯,壓縮 + 重試 大概率能解決
四、其他內存分析工具
1. MAT:免費經典的dump分析工具
- MAT 全稱 Eclipse Memory Analysis Tools,是一個分析 Java 堆數據的專業工具,可以計算出內存中對象的實例數量、佔用空間大小、引用關係等,看看是誰阻止了垃圾收集器的回收工作,從而定位內存泄漏的原因。
-
建議配置略大於 dump文件大小的內存,否則可能報錯,編輯 MemoryAnalyzer.ini 添加 -vmargs – Xmx4g
2. gceasy.io:國外的在線分析工具
3. HeapDump社區
阿里大神創業的產品,除了工具,還有不少性能方面的案例
五、總結
- jstat 可以看到 容量、使用量、最小最大容量、使用率、GC耗時、GC是否頻繁
- jmap 可以 快速分析簡單的內存佔用,生成 dump文件 便於後續分析
- 另羅列了 MAT、gceasy.io、HeapDump社區 等,鑑於篇幅原因,暫時不細説了
本文遵守【CC BY-NC】協議,轉載請保留原文出處及本版權聲明,否則將追究法律責任。
本文首先發佈於 https://www.890808.xyz/ ,其他平台需要審核更新慢一些。