JVM优化之jmap的使用以及内存溢出分析

什么是jmap?

jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节
可以使用jmap生成Heap Dump。
在Java命令Java Dump和Java命令:Jstack中分别有关于Java Dump以及线程 Dump的介绍。 
 
 
查看内存使用情况
首先使用idea启动一个Tomcat
在使用 jps 查看该进程 pid
JVM优化之jmap的使用以及内存溢出分析
jmap -heap  pid
JVM优化之jmap的使用以及内存溢出分析

 JVM优化之jmap的使用以及内存溢出分析

 

查看内存中对象数量及大小

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

JVM优化之jmap的使用以及内存溢出分析

#查看活跃对象
jmap -histo:live <pid> | more

 JVM优化之jmap的使用以及内存溢出分析

对象说明

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>

  

JVM优化之jmap的使用以及内存溢出分析

 JVM优化之jmap的使用以及内存溢出分析

 

通过jhat对dump文件进行分析

将jvm的内存dump到文件中,这个文件是一个二进制的文件,不方便查看,这时我们可以借助于jhat工具进行查看

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

  

JVM优化之jmap的使用以及内存溢出分析

在浏览器中进行查看

JVM优化之jmap的使用以及内存溢出分析

在最下面有一个查询功能

JVM优化之jmap的使用以及内存溢出分析

 

输入: select s from java.lang.String s where s.value.length >= 1000 (查询长度大于等于1000的字符串)

JVM优化之jmap的使用以及内存溢出分析

 

结果会在左下角显示出来

JVM优化之jmap的使用以及内存溢出分析

通过MAT工具对dump文件进行分析

MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,

它可以帮助我们查找内存泄漏和减少内存消耗。

使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,

并可以通过报表直观的查看到可能造成这种结果的对象。

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

下载与解压完成之后

JVM优化之jmap的使用以及内存溢出分析

 JVM优化之jmap的使用以及内存溢出分析

 使用

JVM优化之jmap的使用以及内存溢出分析

 JVM优化之jmap的使用以及内存溢出分析

JVM优化之jmap的使用以及内存溢出分析

 

 actions下面的

Histogram:列出内存中的对象,对象的个数以及大小

Dominator Tree:列出最大的对象以其依赖存活的对象

点击Histogram进入查看内存中的对象,对象的个数以及大小

 JVM优化之jmap的使用以及内存溢出分析

 点击Dominator Tree查看最大的对象以其依赖存活的对象

JVM优化之jmap的使用以及内存溢出分析

点击default_report进行查看查看可能存在内存泄露的分析

 JVM优化之jmap的使用以及内存溢出分析

 JVM优化之jmap的使用以及内存溢出分析