Имитация ситуации переполнения памяти
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];
}
}
Сравнение двух гистограмм
Входящие и исходящие ссылки
дерево господства
Показать информацию о потоке
Показать общую информацию о куче
Отображение общей информации о куче, например некоторых объектов, которые потребляют больше всего.