Simular una situación de desbordamiento de memoria
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álisis con MAT
Se puede ver a partir de los resultados del análisis que el 92,16 % de la memoria está ocupada por Object[], por lo que es sospechoso.
Resumen de las principales funciones de la interfaz MAT
Genera volcado de pila en tiempo real
Histograma
El gráfico de barras muestra el uso de cada clase, como el número de clases, el espacio ocupado, etc.
agrupamiento
clasificar
Búsqueda habitual
Ver citas
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 dos histogramas
Referencias de entrada y salida
arbol de dominacion
Mostrar información del hilo
Mostrar información general del montón
Muestra información general del montón, como algunos objetos que consumen más.