1. top 一下获取内存占用率最高的pid。
2. 转到 jdk的bin目录,执行jdk命令。
(1)./jmap -heap pid 查看JVM空间总体使用情况
(2)./jmap -histo pid |more 查看类的实例数和内存量
(3)./jmap -histo:live pid |more 查看所有活着的实例数量。
(4)./jmap -dump:format=b,file=dump_tomcat.dat pid 将内存使用情况dump到文件中
3. 使用MAT工具对dump文件进行分析。
下载MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰
富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。
下载地址:http://www.eclipse.org/mat/downloads.php
然后解压,跟eclipse一样,我们直接启动就可以了,启动界面如下,我们点击左上角“file”或者红框中的“Open a Heap Dump”就可以打开我们的Dump文件。
Dump文件后缀问题,找不到Dump文件时选择All file,就可以看到了
2. 选择Leak Suspects Report(泄露嫌疑报告),进入到主界面
3. 看到主界面,Problem区域就是提示可能有问题的类的信息了,我们可以看到,有一个类的实例占了700M左右,占用了内存总量90%以上了,点击Details可以查看详情,点击See stacktrace可以查看跟踪堆栈找到问题代码所在位置。
4. 下图可以看出来这个对象占用了很多的内存
当然我们也可以切换视图,查看具体对象的一些信息,可以看到这个class生成了133w个实例,肯定是代码出问题了
跟踪代码,定位泄露位置
点击See stacktrace,下图是跟踪的代码位置,可以清晰的看到是第几行生成的对象,进而分析代码