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

вставьте сюда описание изображения

Анализ с помощью МАТ

вставьте сюда описание изображения
вставьте сюда описание изображения
Из результатов анализа видно, что 92,16% памяти занимает Object[], так что это подозрительно.
вставьте сюда описание изображения
вставьте сюда описание изображения

Обзор основных функций интерфейса MAT

вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения

Создание дампа кучи в режиме реального времени

вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения

Гистограмма

Гистограмма показывает использование каждого класса, например, количество классов, занимаемое пространство и т. д.
вставьте сюда описание изображения
вставьте сюда описание изображения

группировка

вставьте сюда описание изображения

Сортировать

вставьте сюда описание изображения

Обычный поиск

вставьте сюда описание изображения

Посмотреть цитаты

вставьте сюда описание изображения
вставьте сюда описание изображения

код

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