jmap
JDK自帶了一些工具可以幫助我們檢視JVM運作的堆記憶體情況,常用的是
jmap指令
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CO2IzNkF2NxU2MhVjNlVGOhZzNmJWMwQGZiZzNwcjY28CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java進階交流:854630135,群裡有阿裡大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。
jmap -heap <pid> 列印堆的使用情況
那麼,從這個輸出中我們也可以大緻看出堆的結構,分為Young Generation (年輕代) 和 Old Generation (老年代)
Young Generation又被劃分為:Eden Space , From Space 和 To Space
可以看到這裡To區是幹淨的,還未被使用,From區已經使用了95%了
jmap -histo[:live] <pid> 列印類的執行個體數量、占用的記憶體、類的名稱,通常我們并不需要看所有的,隻需要看前幾條即可
jmap -dump:live,format=b,file=heap.bin <pid>
以hprof二進制格式dump堆的使用情況(PS:相當于生成一個快照,後續我們可以對這個快照檔案進行分析)
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工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java進階交流:854630135,群裡有阿裡大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。
由于這裡是随便運作的一個工程,并沒有出現記憶體洩漏之類的問題,是以這裡看到的都是一些基礎的java類
檢視引用可以看到biggest object以及它們所占記憶體的比例
我們一級一級的找,可以找到源檔案,然後分析代碼,最終定位到問題之根源
jconsole
可以檢視本地的程序,也可以檢視遠端主機上的程序
例如:jconsole 192.168.102.16:9105
或者本地
其它
如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java進階交流:854630135,群裡有阿裡大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。