jmap
JDK自帶了一些工具可以幫助我們查看JVM運行的堆內存情況,常用的是jmap命令
打印堆的使用情況:
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/downloads.php
解壓之后雙擊MemoryAnalyzer.exe即可運行
打開剛才的heap.bin文件
可以看到下面有三個選項卡,包括可以執行的操作和報表
先看第一個Histogram
由於這里是隨便運行的一個工程,並沒有出現內存泄漏之類的問題,所以這里看到的都是一些基礎的java類
查看引用
Dominator Tree 可以看到biggest object以及它們所占內存的比例
我們一級一級的找,可以找到源文件,然后分析代碼,最終定位到問題之根源
jconsole
可以查看本地的進程,也可以查看遠程主機上的進程
例如:jconsole 192.168.102.16:9105
或者本地
其它
參考:
https://blog.csdn.net/xiaojia1100/article/details/78675960
https://www.cnblogs.com/kongzhongqijing/articles/3621163.html
https://blog.csdn.net/alli0968/article/details/52460008
https://blog.csdn.net/u011512180/article/details/51874097
作者:廢物大師兄
來源:www.cnblogs.com/cjsblog/p/9561375.html
近期熱文推薦:
1.Java 15 正式發布, 14 個新特性,刷新你的認知!!
2.終於靠開源項目弄到 IntelliJ IDEA 激活碼了,真香!
3.我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看。。
覺得不錯,別忘了隨手點贊+轉發哦!