JVM日志分析工具一Memory Analyzer Mat介绍和使用
目录
一、JDK 、JRE和JVM 的关系
二、Java进程内存占用查询命令
2.1JAVA 代码是如何执行的
2.2何时用hrpof文件分析内存
其实如果只是要了解JVM的运行状况,然后去进行JVM GC优化,通常来说jstat就完全够用了。但是有的时候可能我们会发现JVM新增对象的速度很快,然后就想要去看看,到底什么对象占据了那么多的内存。
如果发现有的对象在代码中可以优化一下创建的时机,避免那种对象对内存占用过大,那么也许可以去反过来优化一下代码。当然,其实如果不是出现OOM那种极端情况,也并没有那么大的必要去着急优化代码。
我们通过如下可以 大致连接JVM 内存的状态,老年代和新生代使用情况。
jmap -heap 11469
jstat -gc 11469 5000
但是如果你仅仅只是看一个大概,感觉就只是看看上述那些对象占用内存的情况,感觉还不够,想要来点深入而且仔细点的那就可以用jmap命令生成一个堆内存快照放到一个文件里去,用如下的命令即可:
jmap -dump:live,format=b,file=dump.hprof PID
这个命令会在当前目录下生成一个dump.hrpof文件,这里是二进制的格式,你不能直接打开看的,其把这一时刻JVM堆内存里所有对象的快照放到文件里去了,供你后续去分析。
三、Memory Analyzer Mat
3.1Memory Analyzer Mat安装
Memory Analyzer Mat下载地址:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation
关于 HeapDumpOnOutOfMemoryError 参数讲解:
-XX:+HeapDumpOnOutOfMemoryError 参数表示当JVM发生OOM时,自动生成DUMP文件。
-XX:HeapDumpPath=${目录}参数表示生成DUMP文件的路径,也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof。如果不指定文件名,默认会在项目根目录下生成一个文件,文件名格式为:java_<pid>_<date>_<time>_heapDump.hprof。
-XX:+HeapDumpBeforeFullGC 当 JVM 执行 FullGC前
-XX:+HeapDumpAfterFullGC 当 JVM 执行 FullGC后
因为程序存在OOM 问题所以我主动 dump
## 7150 进程号
jmap -dump:live,format=b,file=/hadoop/ops/ftpDS.hprof 7150
可以看到 生成的 hprof 的文件还是比较大的 达到了 1.6G。
3.2 Overview视图
将dump下来的hprof文件打开,视图首页总结出当前这个Heap dump占用了多大的内存,其中涉及的类有多少,对象有多少,类加载器,如果有没有回收的对象,会有一个连接,可以直接参看(图中的Unreachable Objects Histogram)。 比如该例子中显示了Size: 979 MB Classes: 4.2k Objects: 26.1m Class Loader: 46
3.2.1直方图视图(histogram)
histogram视图主要是查看某个类的实例个数,比如我们在检查内存泄漏时候,要判断是否频繁创建了对象,就可以来看对象的个数来看。也可以通过排序看出占用内存大的对象。
3.2.2 Dominator Tree
列举出Retained Size值最大的几个值,你可以将鼠标放到饼图中的扇叶上,可以在右侧看出详细信息:
3.2.3 Top Consumers
1.Biggest Objects (Overview)
2 Biggest Objects
3 Biggest Top-Level Dominator Classes (Overview)
4 Biggest Top-Level Dominator Classes
5 Biggest Top-Level Dominator Class Loaders (Overview)
6 Biggest Top-Level Dominator Packages
3.3 Leak Suspects
3.3.1 Overview
3.3.2 Problem Suspect
这个视图会展示一些可能的内存泄漏的点,比如上图上图显示有2个内存泄漏可疑点。
3.3.3 Problem Suspect 1
"org.apache.hadoop.fs.FileSystem$Cache"”的一个实例文件系统被"sun.misc.Launcher$AppClassLoader @ 0xc04e9290"加载。占用208,987,664字节(20.36%)。内存在“"org.apache.hadoop.fs.FileSystem$Cache"”的一个实例中累积。文件系统被程序"sun.misc.Launcher$AppClassLoader @ 0xc04e9290"加载。
关键字
org.apache.hadoop.fs.FileSystem缓存
3.3.4 Problem Suspect 2
7,670个“org.apache.hadoop.conf.Configuration”实例。配置”,由“sun.misc”加载。"sun.misc.Launcher$AppClassLoader @ 0xc04e9290" 占用813,527,552字节(79.25%)。这些实例是从"java.util.HashMap$Node[]",的一个实例中引用的。由"<系统类加载器>"加载。
看到上述的信息,我们基本能找到在我们代码中造成内存泄漏可疑点的地方,很容易去定位问题。