列印堆的使用情況:
jmap -heap <pid>那麼,從這個輸出中我們也可以大緻看出堆的結構,分為Young Generation (年輕代) 和 Old Generation (老年代)
Young Generation又被劃分為:Eden Space , From Space 和 To Space
可以看到這裡To區是幹淨的,還未被使用,From區已經使用了95%了
列印類的執行個體數量、占用的記憶體、類的名稱,通常我們并不需要看所有的,隻需要看前幾條即可:
jmap -histo[:live] <pid>
以hprof二進制格式dump堆的使用情況(PS:相當于生成一個快照,後續我們可以對這個快照檔案進行分析):
jmap -dump:live,format=b,file=heap.bin <pid>
另外,關注公衆号Java技術棧,在背景回複:JVM46,可以擷取一份 46 頁的 JVM 教程,非常齊全。
Memory Analyzer (MAT)
檔案dump下來以後,可以使用Eclipse的MAT插件進行檢視
如果日常開發用的是eclipse的話,可以直接安裝這個插件,如果不是的話,這個插件也可以獨立運作
https://www.eclipse.org/mat/
https://www.eclipse.org/mat/downloads.php
解壓之後輕按兩下MemoryAnalyzer.exe即可運作 打開剛才的heap.bin檔案
可以看到下面有三個頁籤,包括可以執行的操作和報表
先看第一個Histogram 由于這裡是随便運作的一個工程,并沒有出現記憶體洩漏之類的問題,是以這裡看到的都是一些基礎的java類
檢視引用 Dominator Tree 可以看到biggest object以及它們所占記憶體的比例
我們一級一級的找,可以找到源檔案,然後分析代碼,最終定位到問題之根源
jconsole
可以檢視本地的程序,也可以檢視遠端主機上的程序
例如:jconsole 192.168.102.16:9105
或者本地