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");
}
}
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
Análise com MAT
Pode-se ver pelos resultados da análise que 92,16% da memória está ocupada por Object[], portanto, é suspeito.
Uma visão geral das principais funções da interface MAT
Gerar despejo de heap em tempo real
Histograma
O gráfico de barras mostra o uso de cada classe, como o número de classes, o espaço ocupado, etc.
agrupamento
ordenar
Pesquisa normal
Ver citações
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
Referências de entrada e saída
árvore de dominação
Exibir informações do tópico
Exibir informações gerais do heap
Exiba informações gerais de heap, como alguns objetos que consomem mais.