本文主要介绍了 在java程序出现了OOM的时候,我们可以怎么办来追踪问题。
1.模拟一下内存溢出:
-
使用main方法测试,写一个一直创建新对象的方法,往list中添加;
Integer size = 2048*10;
List<byte[]> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
System.out.println(i);
TimeUnit.MILLISECONDS.sleep(10);
list.add(new byte[size]);
}
-
cmd打开jvisualvm,打开类,观察堆空间的曲线动态图;
-
dump堆 数据出来,生成一个heapdump-pid.phrof 的文件,使用jvisualvm打开观察数据,可以看到类数量统计,哪一个数据占用的空间最多,存在多少对象;
这里点击堆dump可以下载
观察到这里堆内存中数据量最大的数据
-
生产环境自动dump出oom信息的phrof文件,使用启动参数 -XX:+HeapDumpOnOutOfMemoryError ,导出地址:-XX:+HeapDumpPath=
可以看到,在我们发生了oom后,jvm直接自动给我们dump了一个文件
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid17372.hprof ...
Heap dump file created [63917844 bytes in 0.043 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.example.spring20200217test.SomethingTest.main(SomethingTest.java:68)
-
使用mat(MemoryAnalyzer)工具进行分析,该工具基于eclipse,直接跟jvisualvm类似操作。