1. 程式人生 > >利用jmap和MAT等工具查看JVM運行時堆內存

利用jmap和MAT等工具查看JVM運行時堆內存

exe 工具 劃分 bubuko 進制 targe 第一個 進程 ips

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>  打印類的實例數量、占用的內存、類的名稱,通常我們並不需要看所有的,只需要看前幾條即可

技術分享圖片

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類

查看引用

技術分享圖片

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

利用jmap和MAT等工具查看JVM運行時堆內存