MAT简单分析内存溢出问题

模拟内存溢出情况

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
 * 向List集合中添加100万个字符串,每个字符串由1000个UUID组成。如果程  序能够正常执行,最后打印ok。
 */
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");
    }
}

在这里插入图片描述

-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

在这里插入图片描述

使用MAT进行分析

在这里插入图片描述
在这里插入图片描述
由分析结果可以看出,有92.16%的内存被Object[]占有,所以比较可疑。
在这里插入图片描述
在这里插入图片描述

MAT界面主要功能概览

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实时生成堆dump

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

柱状图(Histogram)

柱状图显示每个类的使用情况,比如类的数量,所占空间等
在这里插入图片描述
在这里插入图片描述

分组

在这里插入图片描述

排序

在这里插入图片描述

正则搜索

在这里插入图片描述

查看引用

在这里插入图片描述
在这里插入图片描述

代码

import java.util.ArrayList;
import java.util.Random;
/**
 * -Xms30m -Xmx30m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps
   -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dump.hprof
 */
public class OOMTest {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        ArrayList<Box> list = new ArrayList<>();
        while(true){
    
    
            Thread.sleep(100);
            list.add(new Box(new Random().nextInt(1024 * 1024)));
        }
    }
}

class Box{
    
    
    private byte[] data;

    public Box(int length) {
    
    
        this.data = new byte[length];
    }
}

两个直方图比较

在这里插入图片描述
在这里插入图片描述

入引用和出引用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

支配树

在这里插入图片描述
在这里插入图片描述

显示线程信息

在这里插入图片描述
在这里插入图片描述

显示堆总体信息

在这里插入图片描述
显示堆总体信息,比如消耗最大的一些对象等。

猜你喜欢

转载自blog.csdn.net/fengsheng5210/article/details/123681123
今日推荐