模拟内存溢出情况
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
使用MAT进行分析
由分析结果可以看出,有92.16%的内存被Object[]占有,所以比较可疑。
MAT界面主要功能概览
实时生成堆dump
柱状图(Histogram)
柱状图显示每个类的使用情况,比如类的数量,所占空间等
分组
排序
正则搜索
查看引用
代码
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];
}
}
两个直方图比较
入引用和出引用
支配树
显示线程信息
显示堆总体信息
显示堆总体信息,比如消耗最大的一些对象等。