日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

    歡迎訪問 生活随笔!

    生活随笔

    當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

    编程问答

    如何使用MAT进行JVM内存泄露分析

    發布時間:2023/12/3 编程问答 24 豆豆
    生活随笔 收集整理的這篇文章主要介紹了 如何使用MAT进行JVM内存泄露分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

    轉載自??如何使用MAT進行JVM內存泄露分析

    在《Java Agent的隔離實現以及卸載時一些坑》中,卸載Agent之后,使用 jmap-histo:live pid命令驗證執行FGC,相關Class是否會被回收,結果遇到了一些問題,最終通過MAT內存分析才定位到了問題,本文介紹如何使用MAT進行內存泄露分析。

    MAT安裝

    MAT是eclipse中的一個插件,不過也提供了獨立的版本,在IDEA風靡的今天,建議直接使用獨立版本,官網下載地址?

    http://www.eclipse.org/mat/downloads.php?

    根據操作系統版本下載最新的MAT

    ?

    MAT配置

    找到MemoryAnalyzer.ini文件,該文件里面有個Xmx參數,該參數表示最大內存占用量,默認為1024m,根據堆轉儲文件大小修改該參數即可。

    獲取堆轉儲文件

    1、如果想主動獲取,可以使用jamp命令,對于部署到服務器上的程序可以采用這種方式,獲取堆轉儲文件后scp到本地,然后本地分析。

  1. jmap -dump:format=b,file=<dumpfile.hprof> <pid>
  2. 2、如果想在發生內存溢出的時候自動dump,需要添加下面參數

  3. -XX:+HeapDumpOnOutOfMemoryError
  4. MAT使用

    打開MAT之后,加載dump文件,顯示下面的界面。

    一般用到比較多的2個功能 1、Histogram 2、Leak Suspects

    Histogram

    這個功能主要是查看類和對象關系,對象和對象之間的關系,用來定位哪些對象在FGC之后還活著,哪些對象占大部分內存。

    1、點開Histogram,可列出每一個類的實例數,支持正則表達式查找,也可以計算出該類所有對象的retained size。

    ?

    Shallow Heap就是對象本身占用內存的大小,不包含其引用的對象內存,實際分析中作用不大。常規對象(非數組)的ShallowSize由其成員變量的數量和類型決定。數組的shallow size有數組元素的類型(對象類型、基本類型)和數組長度決定。對象成員都是些引用,真正的內存都在堆上,看起來是一堆原生的byte[], char[], int[],對象本身的內存都很小。

    Retained Heap值的計算方式是將Retained Set(當該對象被回收時那些將被GC回收的對象集合)中的所有對象大小疊加。或者說,因為X被釋放,導致其它所有被釋放對象(包括被遞歸釋放的)所占的heap大小。

    Retained Heap例子: 一個ArrayList對象持有100個對象,每一個占用16 bytes,如果這個list對象被回收,那么其中100個對象也可以被回收,可以回收16*100 + X的內存,X代表ArrayList的shallow大小。

    所以,RetainedHeap可以更精確的反映一個對象實際占用的大小。

    2、選擇一個Class,右鍵選擇List objects > with incoming references

    ?

    在新頁面會顯示通過這個class創建的對象信息

    3、選擇一個對象,右鍵選擇Path to GC Roots > **,通常在排查內存泄漏的時候,我們會選擇exclude all phantom/weak/soft etc.references, 意思是查看排除虛引用/弱引用/軟引用等的引用鏈,因為被虛引用/弱引用/軟引用的對象可以直接被GC給回收,我們要看的就是某個對象否還存在Strong 引用鏈(在導出HeapDump之前要手動出發GC來保證),如果有,則說明存在內存泄漏,然后再去排查具體引用。

    ?

    這時會拿到GC Roots到該對象的路徑,通過對象之間的引用,可以清楚的看出這個對象沒有被回收的原因,然后再去定位問題。

    假如說上面對象此時本來應該是被GC掉的,簡單的辦法就是將其中的某處置為null或者remove掉,使其到GC Root無路徑可達,處于不可觸及狀態,垃圾回收器就可以回收了。

    Leak Suspects

    Leak Suspects 界面提示可能存在內存的泄露。

    ?

    然后接著,是問題一的描述,列出了一些比較大的實例。

    ?

    點擊Details可以看到細節信息

    ?

    點開Details進入詳情頁面,在詳情頁面Shortest Paths To the Accumulation Point表示GC root到內存消耗聚集點的最短路徑,如果某個內存消耗聚集點有路徑到達GC root,則該內存消耗聚集點不會被當做垃圾被回收。

    內存快照對比

    為了有效的找出內存泄露的對象,一般會獲取兩個堆轉儲文件(先dump一個,隔段時間再dump一個),并同時打開兩個dump文件。

    打開其中一個Histogram,然后點擊下面按鈕。

    ?

    選擇另外一個需要對比的dump文件

    ?

    ?

    通過對比結果可以方便的看出對象的變化情況,并快速定位問題。

    ?

    還不會使用的MAT的同學,趕緊學起來,機會都是留給有準備的人。

    總結

    以上是生活随笔為你收集整理的如何使用MAT进行JVM内存泄露分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。