线上解决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)))小迪网络安全笔记

这些处理线上故障的技巧你掌握了吗?

IDEA远程debug线上项目(实操版)

redis线上问题及解决方法

实操 | 内存占用减少高达90%,还不用升级硬件?没错,这篇文章教你妙用Pandas轻松处理大规模数据

关于线上优化服务器视频笔记1-----调优线上服务器