【深入理解jvm虚拟机】内存溢出分析工具MAT

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010391342/article/details/89227823

演示内存溢出

public class OutOfMemoryTest {
    /**
     * 定义一个静态内部类
     */
    static  class Test{ }

    /**
     * 无限创建对象 模拟内存溢出
     *
     * 启动参数设置: 限制最大可用内存,并生成内存溢出快照
     * -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=F:\MemoryAnalyze\dump -Xms5m -Xmx5m
     *
     * @param args
     */
    public static void main(String[] args) {
        List<Test> list=new ArrayList<>();
        while (true){
            list.add(new Test());
        }
    }
}

运行结果 显示堆内存溢出,并且成了快照文件
在这里插入图片描述

下载MAT工具

http://www.eclipse.org/mat/downloads.php

分析快照文件

启动MAT工具 选择File -> Open Heap Dump

总览视图

  • Histogram :查看内存中的对象,对象的个数以及大小。
  • Dominator Tree :列出那个线程,以及线程下面的那些对象占用的空间。
  • Top consumers:通过图形列出最大的object。
  • Leak Suspects:通过MA自动分析泄漏的原因。

Histogram

  • Class Name : 类名称,java类名
  • Objects : 类的对象的数量,这个对象被创建了多少个
  • Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
  • Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和
    在这里插入图片描述
  • Problem Suspect 1 : 区域就是可能发生问题的区域

查看如下视图 分析详细情况

  • Shallow Heap:选中行对象占堆内存大小,
  • Retained Heap:选中行对象引用的所有对象占堆内存大小
  • Percentage:选中行对象占用内存的百分比

查看占用最高的对象 如下图所示 发生是OutOfMemoryTest这个类创建的过多,找到源码中这个类,优化代码即可解决
内存溢出的元凶

参考链接

猜你喜欢

转载自blog.csdn.net/u010391342/article/details/89227823