天天看點

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

jmap

JDK自帶了一些工具可以幫助我們檢視JVM運作的堆記憶體情況,常用的是

jmap

指令

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java進階交流:854630135,群裡有阿裡大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。

jmap -heap <pid> 列印堆的使用情況

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

那麼,從這個輸出中我們也可以大緻看出堆的結構,分為Young Generation (年輕代) 和 Old Generation (老年代)

Young Generation又被劃分為:Eden Space , From Space 和 To Space

可以看到這裡To區是幹淨的,還未被使用,From區已經使用了95%了

jmap -histo[:live] <pid> 列印類的執行個體數量、占用的記憶體、類的名稱,通常我們并不需要看所有的,隻需要看前幾條即可

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

jmap -dump:live,format=b,file=heap.bin <pid>

以hprof二進制格式dump堆的使用情況(PS:相當于生成一個快照,後續我們可以對這個快照檔案進行分析)

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

Memory Analyzer (MAT)

檔案dump下來以後,可以使用Eclipse的MAT插件進行檢視

如果日常開發用的是eclipse的話,可以直接安裝這個插件,如果不是的話,這個插件也可以獨立運作https://www.eclipse.org/mat/https://www.eclipse.org/mat/downloads.php

解壓之後輕按兩下MemoryAnalyzer.exe即可運作

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

打開剛才的heap.bin檔案

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體
eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

可以看到下面有三個頁籤,包括可以執行的操作和報表

先看第一個

Histogram

如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java進階交流:854630135,群裡有阿裡大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

由于這裡是随便運作的一個工程,并沒有出現記憶體洩漏之類的問題,是以這裡看到的都是一些基礎的java類

檢視引用
eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體
Dominator Tree

可以看到biggest object以及它們所占記憶體的比例

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

我們一級一級的找,可以找到源檔案,然後分析代碼,最終定位到問題之根源

jconsole

可以檢視本地的程序,也可以檢視遠端主機上的程序

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

例如:jconsole 192.168.102.16:9105

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體
eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

或者本地

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

其它

eclipse占用記憶體過大_利用jmap和MAT等工具檢視JVM運作時堆記憶體

如果想學習Java工程化、高性能及分布式、深入淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java進階交流:854630135,群裡有阿裡大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。

繼續閱讀