动态

详情 返回 返回

Java程序性能分析:內存 - 动态 详情

一、前言

  • 開發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分鐘左右一次)
    jstat-gcutil.png

3. jstat -gc

  • 列出 各區域的容量Capacity、使用大小 Utilization,單位是 KB,有容量大小,沒有百分比
  • YGC 開始,是各區域 GC次數、耗時
    jstat-gc.png

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
    jstat-gccapacity.png

三、內存分析:jmap

1. jmap 簡介

jmap 可以 快速分析簡單的內存佔用,生成 dump文件 便於後續分析

2. jmap -histo

  • 快速檢測明顯的內存問題(看不出來問題,可以下一步 jmap -dump)
  • 命令格式:jmap -histo 進程號,建議後面加 | head -行數,不然就等着刷屏吧
    jmap-histo.png

3. jmap -dump

  • 生成的文件,用於深層次分析內存問題
  • 命令格式:jmap -dump:format=b,file=heap.bin <pid>
  • GC以後再 dump,可以確定是不是還沒有觸發GC,內存佔用才高,格式是在 -dump: 後面增加 live,
  • dump文件如果在服務器,建議壓縮以後在傳輸,如下圖 文件大小降低70%
  • 如果是在遠程容器裏面,下載到本地可能報錯,壓縮 + 重試 大概率能解決
    jmap-dump.png

四、其他內存分析工具

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/ ,其他平台需要審核更新慢一些。

javalover123

user avatar mannayang 头像 king_wenzhinan 头像 u_16297326 头像 journey_64224c9377fd5 头像 debuginn 头像 xuxueli 头像 huangxunhui 头像 boxuegu 头像 lvweifu 头像 ruozxby 头像 javadog 头像 dreamlu 头像
点赞 29 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.