天天看點

基于線上環境的jvm堆棧分析,jmap+MAT

一.先安裝必要的工具和環境

    1.jmap隻要jdk正常安裝就預設就有,

    2.MAT安裝,個人一般使用獨立插件的形式安裝,下載下傳位址: http://www.eclipse.org/mat 安裝方式請自行查找

二.生成堆棧檔案并下載下傳到本地

    1.進入線上環境,使用jmap生成堆棧檔案,其中檢視jmap的路徑指令:which jmap

基于線上環境的jvm堆棧分析,jmap+MAT

         檢視對應的java服務程序指令:jps -v|grep server_name

基于線上環境的jvm堆棧分析,jmap+MAT

         生成堆棧檔案:jmap -dump:live,format=b,file=./jmap/map.bin  20874,目錄就是./jmap/map.bin

    2.通過sz指令或者類Xftp工具把map.bin檔案烤到本地。

三.利用MAT分析map.bin檔案

    通過MAT中的File-》Open Heap Dump...      打開map.bin檔案,接下來就可以分析記憶體溢出原因了。

四.MAT中的兩個關鍵字:Shallow Heap,Retained Heap

Shallow Size

對象自身占用的記憶體大小,不包括它引用的對象。

針對非數組類型的對象,它的大小就是對象與它所有的成員變量大小的總和。當然這裡面還會包括一些java語言特性的資料存儲單元。

針對數組類型的對象,它的大小是數組元素對象的大小總和。

Retained Size

Retained Size=目前對象大小+目前對象可直接或間接引用到的對象的大小總和。(間接引用的含義:A->B->C, C就是間接引用)

換句話說,Retained Size就是目前對象被GC後,從Heap上總共能釋放掉的記憶體。

不過,釋放的時候還要排除被GC Roots直接或間接引用的對象。他們暫時不會被被當做Garbage

基于線上環境的jvm堆棧分析,jmap+MAT

jmap的一些指令

  • jmap pid #列印記憶體使用的摘要資訊
  • jmap –heap pid #java heap資訊
  • jmap -histo:live pid #統計對象count ,live表示在使用
  • jmap -histo pid >mem.txt #列印比較簡單的各個有多少個對象占了多少記憶體的資訊,一般重定向的檔案
  • jmap -dump:format=b,file=mem.dat pid #将記憶體使用的詳細情況輸出到mem.dat 檔案