线上解决OOM-MAT工具实操
Posted 赵晓东-Nastu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线上解决OOM-MAT工具实操相关的知识,希望对你有一定的参考价值。
描述
最近线上报OOM了,我们来分析一下是什么原因,怎么使用MAT进行解决OOM,解决这个问题的方法论是:
(1)为什么会有快照文件
(2)找出内存占用过大的对象
(3)谁引用内存占用过大的对象
(4)定位到具体的哪行代码
实战
(一)下载并导入dump
首先下载MAT:http://www.eclipse.org/mat/downloads.php
下载之后如果是低于11版本的,我们需要下载11版本之上的JDK,然后在MemoryAnalyzer.ini文件中修改javaw.exe
如果我们的dump文件大于1024M,我们还需要修改xmx为5120m
这样我们就可以打开了。然后用File->Open Heap Dump
去导入dump文件
就可以看到这样的一个界面了。
(二)分析dump文件
(1)为什么会有快照文件:
因为内存占用过多,没办法分配更多的空间,然后才发生内存溢出的异常。
(2)找出内存占用过大的对象
MAT-histogram来进行查找,一般是按照占用的内存倒序排序的
(3)谁引用内存占用过大的对象 (MAT的dominator_tree,用来分析对象的调用链)
被谁引用—被ResultSetImpl引用
(4)定位到具体的哪行代码 (MAT的thread_overview,线程简介图,这个里面有方法的调用链信息和堆栈信息)
当然有可能是我们写的代码,有可能是第三方中间件,所以我们还需要知道第三方中间件的设置。
或许我们直接看Details
就可以找到具体的代码位置。
@DS("crm2021")
@Override
public List<ClonedResourcePO> getResourceCloned(List<ResourceIncrementPO> resourceList)
if(resourceList.size() == 0)
return new ArrayList<>();
List<ClonedResourcePO> resourceCloned = resourceSynchronizationMapper.getResourceCloned(resourceList);
log.info("=============当前公司名称相同下的所有的分身数量 = =================",resourceCloned.size());
if(resourceCloned == null)
return new ArrayList<>();
return resourceCloned;
然后我们发现返回的resourceCloned的数据太多了
解决方法
我们可以采用分页的方式将获取的数据进行批量处理
总结
所以分析线上问题的最重要的是定位到哪里出问题了,然后再解决。
以上是关于线上解决OOM-MAT工具实操的主要内容,如果未能解决你的问题,请参考以下文章
(2020上半年第15天(SQL注入-注入实战(SQL注入(完结)10/10)))小迪网络安全笔记