喜欢研究学习技术,喜欢和志同道合的人交流。 从事测试6年,专职性能3年经验,擅长性能测试,测试框架开发。 励志格言:只要想学习,永远都不会太晚;只要想进步,永远都会有空间。

利用MAT分析内存泄露

上一篇 / 下一篇  2018-06-20 10:35:40 / 个人分类:性能测试

分析工具:MemoryAnalyzer
开发工具:Eclipse4.4.0
 
1、运行以下代码。
定义一个list集合,并且指定为集合中存放Integer数据类型,循环加载数据,无退出。

图片

2、运行程序一段时间后,出现了报错的情况。明显提示:内存溢出了。那么在实际的项目中如何去定位分析是哪一行代码内存溢出了呢?下面借助MAT内存分析工具来对这段代码进行具体的分析。
图片

图片


3、 此时此刻,将此段代码进行内存dump,利用MAT在进行分析。如果是web项目,可以通过jconsole,或者,jvisualvm等jdk自带的监控工具对代码实行监控,并且可对项目对异常的代码进行内存dump,dump堆内存建议dump3次以上,更确保准确性。
一下两个参数含义:-xx:+HeapDumpOnOutOfMemoryError:当jvm发生OOM时自动进行内存dump操作。
                               -XX:HeapDumpPath=c:/outOfmemeryh.prof dump堆内存存放的路径已经命名,这里存放的是C盘根目录。 

Ã¥›¾ç‰‡


4、打开MAT,选择我已经dump在C盘路径下的堆内存文件快照。outOfmemeryh.prof,如下所示:
MAT打开默认页面显示,饼图代表了程序内存消耗的一些基本信息。可以从饼图看到有a b c d e共5个怀疑的地方存在内存泄露。
下面该如何进具体分析定位呢?
图片

图片


5、MAT 重点需要关注3个地方 。
    1、Histogram: 类实例化创建的情况
    2、Leak Suspe:
主要是列出怀疑的内存泄露处。
    3、
Dominator Tree:列出了堆的最大对象。

6、那么最明显的方式就是先打开最值得怀疑的几个地方。点击【
Leak Suspe】 ,跳转到详情页面。点击【Details】。进入到详情页面后,可以看到各个当前最大对象的创建情况及调用。

图片

7、在详情页中,清楚的看待了线程栈信息,以及提示哪个包名及哪行代码出现了异常。此段代码在com.test.list.TestList.addList()方法异常。成功定位到内存泄露的方法所在。好吧,将此段异常报错直接反馈给开发人员,完事。
图片

TAG:

 

评分:0

我来说两句

Open Toolbar