在一个项目中,突然出现了OOM故障,那么该如何排除~
-
能够看到代码第几行出错:内存快照分析工具,MAT,Jprofiler
-
Dubug,一行行代码分析!
MAT,Jprofiler作用:
-
分析Dump内存文件,快速定位内存泄露
-
获得堆中的数据
-
获得大的对象
-
...
查看虚拟机内存
虚拟机试图使用的最大内存和虚拟机的初始化总内存
public class Test {
public static void main(String[] args) {
// 获取虚拟机试图使用的最大内存
long max = Runtime.getRuntime().maxMemory();
// 获取jvm初始化总内存
long total = Runtime.getRuntime().totalMemory();
System.out.println("max="+max+"字节\t"+(max/(double)1021/1024)+"MB\t"+(max/(double)1021/1024/1024)+"GB");
System.out.println("total="+total+"字节\t"+(total/(double)1024/1024)+"MB\t"+(total/(double)1021/1024/1024)+"GB");
// 默认情况下:分配的最大内存是电脑内存的1/4;初始化的内存是电脑内存的1/64
// 分析OOM:
// 1.尝试扩大堆内存,看结果
// 2.分析内存,看一下哪个地方出现了问题(专业工具)JProfiler
// -Xms1024m -Xmx1024m -XX:+PrintGCDetails
// 305664K+699392K = 1005056K 981.5M
}
}
设置VM options之前
设置VM options之前(-Xms1024m -Xmx1024m -XX:+PrintGCDetails)
idea设置JVM堆内存大小
idea的VM options设置
-Xms1m -Xmx1m -XX:+PrintGCDetails
-Xms 设置初始化内存分配大小,默认1/64
-Xmx 设置最大分配内存大小,默认1/4
-XX:+PrintGCDetails --- 打印GC垃圾回收信息
-XX:+HeapDumpOnOutOfMemoryError --- OOM DUMP
制造OOM错误
package com.yuan;
import java.util.ArrayList;
//dump -Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError OOM dump
//默认情况下,分配的最大内存是电脑内存的1/4 而初始化的内存是 1/64
//-Xms 设置初始化内存分配大小 默认初始化的内存电脑内存的1/164
//-Xmx 设置最大分配内存,最大内存是电脑内存的1/4
//-XX:+PrintGCDetails 打印GC垃圾回收信息
public class demo01 {
byte[] array = new byte[1 * 1024 * 1024];
public static void main(String[] args) {
ArrayList<demo01> list = new ArrayList<>();
int count = 0;
try {
while (true) {
list.add(new demo01());
count++;
}
} catch (Error e) {
System.out.println("count:" + count);
e.printStackTrace();
}
}
}
idea的VM options设置 -XX:+PrintGCDetails --- 打印GC垃圾回收信息
然后再次运行,idea的VM options设置 -Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError
在当前项目路径下有一个hprof文件
双击打开
下面可以看出ArrayList存放对象太大了
下面可以看出具体哪一行报的错误