MAT分析内存溢出

MAT分析内存溢出Heap过程

Posted by Spencer on November 3, 2018

安裝MAT

MAT 下载: http://www.eclipse.org/mat/

首先配置jvm参数,输出Heap文件,默认文件名:java_pidxxx.hprof.

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/Spencer/vmlogs/ 

也可以手动收集Heap文件

先要非live方式保留现场,获取dump文件

jmap -dump:format=b,file=heap.bin  pid 

live方式dump后(生产环境请谨慎使用,因为live方式触发FullGC)

jmap -dump:live,format=b,file=heapLive.bin  pid 

再看一下heap里对象情况

jstat -gcutil pid 3s 3

打开MAT,导入Heap文件

选择Leak Suspects Report

在Reports,选择Leak Suspects

选择Details

选择对象,看左侧窗口Attributes。分析查找内存溢出点结合我们的系统代码找具体的业务对象,此处我们可以看到我们的bm文件

在对象树,分析查找内存溢出点结合我们的系统代码找具体的业务对象。此处我们可以看到我们的bm文件

打开对象依赖关系树形视图

分析查找内存溢出点,首先查看占用大的对象

打开内存占用大的线程明细视图

线程明细视图,内存溢出具体线程

线程明细&栈视图,分析查找内存溢出点。此处我们可以看到我们的bm文件

打开对象列表-with outgoing references视图

分析查找内存溢出点,此处我们可以看到我们的bm文件。还可以看这个占用大小616038440的StringBuffer对象,内容是<record/>

分析查找内存溢出点,此处找到执行query。查看左侧Value视图我们看到这请求的参数和文件以及查询sql,在这里可以看到我们的参数calc_session_id=null。前端获取传递的参数有问题,并且我们这个参数里还有一个fechall=true。直接全表查询300W以上数据,所有的线程都要等待此结果<record/>写出成功。最终造成了内存溢出tomcat挂掉

–EOF–


本文链接:MAT分析内存溢出
作者: Spencer
出处: https://spencerzhang.github.io
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 Spencer及链接。