JVM优化-内存溢出的定位与分析(MAT工具的使用)

本文介绍如何使用MAT工具分析Java应用程序中的内存溢出问题。通过一个具体的案例,演示了如何定位内存溢出的原因并分析其根本原因。

通过MAT工具对dump文件进行分析

1.MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰
富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析
工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止
了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

下载地址:https://www.eclipse.org/downloads/download.php
在这里插入图片描述

二、内存溢出的定位与分析
内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出
现了死循环,读取超大的文件等等,都可能会造成内存溢出。
如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并且进行分析,是正
常还是非正常情况,如果是正常的需求,就应该考虑加大内存的设置,如果是非正常需
求,那么就要对代码进行修改,修复这个bug。
首先,我们得先学会如何定位问题,然后再进行分析。如何定位问题呢,我们需要借助
于jmap与MAT工具进行定位分析。
接下来,我们模拟内存溢出的场景。

1、模拟内存溢出
编写代码,向List集合中添加100万个字符串,每个字符串由1000个UUID组成。如果程
序能够正常执行,最后打印ok。

package cn.mrhan.frames.jvm;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class TestJvmOutOfMemory {
    public static void main(String[] args) {
        List<Object> list = new ArrayList<>();
        for (int i = 0; i < 10000000; i++) {
            String str = "";
            for (int j = 0; j < 1000; j++) {
                str += UUID.randomUUID().toString();
            }
            list.add(str);
        }
        System.out.println("ok");
    }
}

为了演示效果,我们将设置执行的参数,这里使用的是Idea编辑器。

设置参数:‐Xms8m ‐Xmx8m ‐XX:+HeapDumpOnOutOfMemoryError

运行测试结果

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid4772.hprof ...
Heap dump file created [9245221 bytes in 0.038 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
    at java.lang.StringBuilder.append(StringBuilder.java:136)
    at cn.mrhan.frames.jvm.TestJvmOutOfMemory.main(TestJvmOutOfMemory.java:13)

Process finished with exit code 1

将生成的文件导入mat查看

在这里插入图片描述

在这里插入图片描述

可以看到,有75%的内存由Object[]数组占有,所以比较可疑。
分析:这个可疑是正确的,因为已经有超过90%的内存都被它占有,这是非常有可能出
现内存溢出的。
查看详情:
在这里插入图片描述

可以看到集合中存储了大量的uuid字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值