目录标题
前言
Windows环境下
Linux下
Jmap指令查看内存中对象的信息
内存分析:使用MAT工具对dump文件进行分析
跟踪代码,定位泄露位置
前言
虽然Java有很好的的内存管理,但是在进行开发的过程中,还是难免遇到内存方面的问题,例如:内存无缘无故增长,不释放;突然出现java.lang.OutOfMemoryError: Java heap space 内存溢出错误等。今天讲一下怎么对内存进行简单的分析和排查。
Windows环境下
windows 环境下我们可以用JDK自带的两个工具jconsole 和jvisualvm进行简单的分析,这两个工具都在JDK的bin目录下

下面简单介绍一下如何使用,双击打开程序,左面会显示已经运行的Java程序,双击选中我们想要分析的程序,会在右面显示一些基础信息。

点击监视页签,切换到监视页面,页面上会显示CPU使用,堆和Pem内存使用,类的加载情况,线程的运行情况,这些图表信息可以清晰形象的展示程序运行的状态。然后点击堆Dump可以查看堆的使用详情。

其中可以看到每个类实例数量和占得百分比,内存大小等,右键还可以查看具体的实例对象信息。

点击线程页签可以切换到线程的页面,这里可以看到每个线程的运行情况,包括休眠、运行、等待、挂起等状态的具体情况,也可以点击线程Dump查看某一个时间点的状态


通过这些信息我们就可以简单的分析程序运行中出现的包括死锁,内存增大,内存溢出等问题,初步确定问题。
Linux下
Jmap指令查看内存中对象的信息
jmap -heap
可以查看JVM内存使用总体情况

jmap -histo |more
可以查看内存中每个class的实例数和占用的内存量

jmap -histo:live |more
可以查看所有活跃的实例对象,同上图
jmap -dump:format=b,file=dump_tomcat.dat
将内存使用情况dump到文件中

从服务器把生成的Dump文件下载到本地,准备下一步工作
内存分析:使用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,下图是跟踪的代码位置,可以清晰的看到是第几行生成的对象,进而分析代码问题

这样就成功定位问题代码位置,解决我们遇到的内存溢出问题




