在一个项目中,突然出现了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的VM options设置
-Xms1m -Xmx1m -XX:+PrintGCDetails
-Xms 设置初始化内存分配大小,默认1/64
-Xmx 设置最大分配内存大小,默认1/4
-XX:+PrintGCDetails --- 打印GC垃圾回收信息
-XX:+HeapDumpOnOutOfMemoryError --- OOM DUMP
- 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
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存放对象太大了

下面可以看出具体哪一行报的错误
