MAT análise simples do problema de estouro de memória

Simular uma situação de estouro de memória

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");
    }
}

insira a descrição da imagem aqui

-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

insira a descrição da imagem aqui

Análise com MAT

insira a descrição da imagem aqui
insira a descrição da imagem aqui
Pode-se ver pelos resultados da análise que 92,16% da memória está ocupada por Object[], portanto, é suspeito.
insira a descrição da imagem aqui
insira a descrição da imagem aqui

Uma visão geral das principais funções da interface MAT

insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui

Gerar despejo de heap em tempo real

insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui

Histograma

O gráfico de barras mostra o uso de cada classe, como o número de classes, o espaço ocupado, etc.
insira a descrição da imagem aqui
insira a descrição da imagem aqui

agrupamento

insira a descrição da imagem aqui

ordenar

insira a descrição da imagem aqui

Pesquisa normal

insira a descrição da imagem aqui

Ver citações

insira a descrição da imagem aqui
insira a descrição da imagem aqui

código

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];
    }
}

Comparando dois histogramas

insira a descrição da imagem aqui
insira a descrição da imagem aqui

Referências de entrada e saída

insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui
insira a descrição da imagem aqui

árvore de dominação

insira a descrição da imagem aqui
insira a descrição da imagem aqui

Exibir informações do tópico

insira a descrição da imagem aqui
insira a descrição da imagem aqui

Exibir informações gerais do heap

insira a descrição da imagem aqui
Exiba informações gerais de heap, como alguns objetos que consomem mais.

Acho que você gosta

Origin blog.csdn.net/fengsheng5210/article/details/123681123
Recomendado
Clasificación