内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出现了死循环,读取超大的文件等,都会造成内存溢出。
如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并进行分析,是正常情况还是非正常情况,如果是正常的需求,就应该考虑加大内存的设置,如果不是正常的需求,那么就要对代码进行修改,修复这个bug。
1.模拟内存溢出
public class TestJVMOutOfMemory {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
StringBuilder str = new StringBuilder();
for (int j = 0; j < 1000; j++) {
str.append(UUID.randomUUID().toString());
}
list.add(str.toString());
}
System.out.println("ok");
}
}
设置启动参数以更快的出现问题
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
测试结果如下:
java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid1102.hprof ... Heap dump file created [7959370 bytes in 0.063 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:3664) at java.lang.String.<init>(String.java:207) at java.lang.StringBuilder.toString(StringBuilder.java:407) at com.yfy.demo01.TestJVMOutOfMemory.main(TestJVMOutOfMemory.java:21)
2.在MAT中进行分析
可以看到,有93.88的内存由Object[]数组占有。这个地方是有可能出现内存溢出的。
点击Details查看详情:
可以看到集合中存储了大量的uuid字符串。