一.先安裝必要的工具和環境
1.jmap隻要jdk正常安裝就預設就有,
2.MAT安裝,個人一般使用獨立插件的形式安裝,下載下傳位址: http://www.eclipse.org/mat 安裝方式請自行查找
二.生成堆棧檔案并下載下傳到本地
1.進入線上環境,使用jmap生成堆棧檔案,其中檢視jmap的路徑指令:which jmap
檢視對應的java服務程序指令:jps -v|grep server_name
生成堆棧檔案: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
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 檔案