问:在一个项目中,突然出现了OOM故障,那么该如何排除~研究为什么出错
- 能够看到代码第几行出错:内存快照分析工具,MAT,JProfiler
- Dubug,一行行分析!
MAT,JProfiler的作用
- 分析Dump内存文件,快速定位内存泄漏:
- 获得堆中的数据
- 获得大的对象~
package com.Liao.lesson1;
import java.util.ArrayList;
public class Demo1 {
byte[] array = new byte[1*1024*1024];
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
int count = 0;
try {
while (true) {
list.add(new Demo1());
count++;
}
}catch (Error e){
System.out.println("count:"+count);
e.printStackTrace();
}
}
}
C:\Users\jdk-11\bin\java.exe -Xms1m -Xms8m -XX:+HeapDumpOnOutOfMemoryError “-javaagent:D:\IntelliJ IDEA Community Edition 2021.2.3\lib\idea_rt.jar=56765:D:\IntelliJ IDEA Community Edition 2021.2.3\bin” -Dfile.encoding=GBK -classpath D:\JavaProject\out\production\JavaProjectJVM com.Liao.lesson1.Demo1
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid13724.hprof …
Heap dump file created [1054568374 bytes in 0.927 secs]
count:1002
java.lang.OutOfMemoryError: Java heap space
at com.Liao.lesson1.Demo1.(Demo1.java:6)
at com.Liao.lesson1.Demo1.main(Demo1.java:12)
== -Xms 设置初始化内存分配大小 1/64
-Xmx 设置最大分配内存 默认1/4
-XX:+HeapDumpOnOutOfMemoryError 打印堆内存溢出
-XX:+PrintGCDetails 打印GC垃圾回收信息==