JVM優化之jmap的使用以及內存溢出分析


什么是jmap?

jmap是JDK自帶的工具軟件,主要用於打印指定Java進程(或核心文件、遠程調試服務器)的共享對象內存映射或堆內存細節
可以使用jmap生成Heap Dump。
在Java命令Java Dump和Java命令:Jstack中分別有關於Java Dump以及線程 Dump的介紹。 
 
 
查看內存使用情況
首先使用idea啟動一個Tomcat
在使用 jps 查看該進程 pid
jmap -heap  pid

 

 

 

 

查看內存中對象數量及大小

#查看所有對象,包括活躍以及非活躍的
jmap -histo <pid> | more

 

#查看活躍對象
jmap -histo:live <pid> | more

 

對象說明

B: byte
C:char
D:double
F: float
I: int
J :long
Z :boolean
'[' :數組,如:'[I':表示int[]
'[L+':類名 其他對象

將內存使用情況dump到文件中

有些時候我們需要將jvm當前內存中的情況dump到文件中,然后對它進行分析,jmap也
是支持dump到文件中的。

#用法:
jmap ‐dump:format=b,file=dumpFileName <pid>

  

 

 

 

 

通過jhat對dump文件進行分析

將jvm的內存dump到文件中,這個文件是一個二進制的文件,不方便查看,這時我們可以借助於jhat工具進行查看

#用法:
jhat ‐port <port> <file>

  

 

在瀏覽器中進行查看

 

在最下面有一個查詢功能

 

 

輸入: select s from java.lang.String s where s.value.length >= 1000 (查詢長度大於等於1000的字符串)

 

 

結果會在左下角顯示出來

通過MAT工具對dump文件進行分析

MAT(Memory Analyzer Tool),一個基於Eclipse的內存分析工具,是一個快速、功能豐富的JAVA heap分析工具,

它可以幫助我們查找內存泄漏和減少內存消耗。

使用內存分析工具從眾多的對象中進行分析,快速的計算出在內存中對象的占用大小,看看是誰阻止了垃圾收集器的回收工作,

並可以通過報表直觀的查看到可能造成這種結果的對象。

官網地址:https://www.eclipse.org/mat/

下載與解壓完成之后

 

 

 

 使用

 

 

 

 

 actions下面的

Histogram:列出內存中的對象,對象的個數以及大小

Dominator Tree:列出最大的對象以其依賴存活的對象

 

點擊Histogram進入查看內存中的對象,對象的個數以及大小

 

 

 點擊Dominator Tree查看最大的對象以其依賴存活的對象

 

點擊default_report進行查看查看可能存在內存泄露的分析

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM