Eclipse MAT分析内存案例

前言

本文记录一次使用Eclipse MAT排查内存问题的案例,缘由是线上某服务OOM,排查得知jvm old区占满,但是gc了还是无法释放

实战

首先在线上服务器排查发现某应用占用了大量的内存,由一个ConcurrentHashMap对象造成的,最终分析的原因是一直往成员对象ConcurrentHashMap存对象,但是并没有释放,这些对象gc都无法回收,导致了oom

本文就模拟一次该场景进行分析下

static List<String> list1 = new ArrayList<>();

public void test() {
	for (int i = 0; i < 10000000; i++) {
            list1.add(new String("" + i));
        }
    System.out.println("list1.size() = " + list1.size());
}

伪代码如上,执行一个方法往一个成员变量list1放了1000万个String对象

假设此时list1对象太大,导致了oom

分析

分析内存问题的常见的两大工具有:

  1. jvisualvm:jvm1.8及以下自带的,可以分析内存文件、线程dump文件等,也可以在线查看某个运行的java程序运行情况等
  2. eclipse mat(Memory Analyzer),官网:https://www.eclipse.org/mat/,需自行下载,看名字就知道是专门分析内存情况的

如果要分析以上场景,推荐使用mat(因为jvisualvm里面我没找到通过对象关联到代码的地方,可自行研究下),分析内存还是MAT更擅长一点

1、首先先把堆dump到本地

先执行jps
jps

18144 Launcher
4640 RemoteMavenServer36
7156 Jps
9508 RemoteMavenServer
8120 DemoApplication

上面的DemoApplication就是我本地启动的一个SpringBoot应用,可见pid=8120

2、dump到本地

jmap -dump:format=b,file=heap.hprof  8120

此时本地就有一个heap.hprof文件,并且文件大小达到了1.5G

3、打开mat
在这里插入图片描述
一打开,其实mat已经帮我们分析了一把,可以看的它分析出DemoApplication类占用了总内存:615,300,824 (91.36%) bytes

上面的是打开时的一个分析结果,我们也可以看完整的,点击前面的Overview

在这里插入图片描述

Dominator Tree,可以查看大对象树,我们这种情况,肯定是某个类占用的内存很大

在这里插入图片描述
通过上面这个界面,可以很清晰的看到了,DemoApplication类里面有个list1=ArrayList,ArrayList里面有1000万个String对象

可以看的mat甚至可以定位到某个类的某个变量,这样就很方便分析内存问题了

线上应用可以配置当发生oom的时候,自动dump出一个文件,这样可以便于出现问题线上快速重启,然后再分析dump文件,只需要配置jvm参数即可:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/error/oomheapdump.hprof

另外需要说下,dump文件一般都是比较大的,一般都是好几个g,此时需要自己电脑内存大一些,如果mat打开内存不够,则需要修改mat目录下面的MemoryAnalyzer.ini文件,把里面的-Xmx参数调大就好了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MAT (Memory Analyzer Tool) 是一款Java内存分析工具,用于帮助开发人员识别和解决Java应用程序中的内存问题。下载MAT可以通过以下步骤进行: 1. 打开Eclipse IDE或访问Eclipse官方网站(https://www.eclipse.org/mat/)。 2. 在"Eclipse Downloads"页面中,选择适合您操作系统的Eclipse版本,然后点击"Download"按钮。 3. 完成下载后,解压缩下载的文件,然后打开Eclipse IDE。 4. 在Eclipse IDE中,选择 "Help" 菜单,然后点击 "Eclipse Marketplace"。 5. 在"Eclipse Marketplace"窗口中,搜索 "Memory Analyzer"。 6. 从搜索结果中,选择 "Memory Analyzer" 插件,并点击 "Go to Marketplace"。 7. 在新打开的网页上,点击 "Install"按钮,并按照提示完成插件的安装。 8. 插件安装完成后,重新启动Eclipse IDE。 MAT下载完成后,可以通过以下步骤进行内存分析: 1. 在Eclipse IDE中,打开已经运行的Java应用程序的Heap Dump文件(以"hprof"扩展名结尾)。 2. 选择 "File" 菜单,然后点击 "Open Heap Dump"。 3. 在弹出的对话框中,浏览并选择相应的Heap Dump文件,然后点击 "Open"。 4. MAT将会加载并分析Heap Dump文件,这可能需要一些时间,取决于文件的大小。 5. 在MAT分析结果视图中,可以通过不同的选项和功能来识别内存问题,比如查找内存泄漏、查看对象实例、查看对象引用关系等。 6. 根据分析结果,可以采取相应的措施来优化内存使用,并解决应用程序的内存问题。 通过使用MAT工具进行内存分析,开发人员可以更好地理解Java应用程序的内存使用情况,并定位和修复潜在的内存问题,从而提高应用程序的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值