JVM调优之使用JProfiler工具分析java堆内存溢出OOM原因
JProfiler分析结果展示
配置
首先我们在IDEA安装JProfiler插件
之后下载JProfiler的软件(有破解版,自行上网搜即可)
然后在IDEA的设置里面找到Tools的JProfiler,设置文件目录对应到exe文件,与你刚安装的软件的目录一致
配置好之后,开始调试
我们先输入一下代码,设置一个ArrayList,无限制往里面添加大对象
public class Hellow { Byte[] arr = new Byte[1 * 1024 * 1024]; public static void main(String[] args) { final ArrayList<Object> list = new ArrayList<>(); int count = 0; try { while (true) { list.add(new Hellow()); count++; } } catch (OutOfMemoryError error) { error.printStackTrace(); System.out.println(count); } } }
然后配置JVM内存,目的是为了让堆内存更容易溢出
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
HeapDumpOnOutOfMemoryError的意思为:Dump出一个关于OOM(OutOfMemory)的hprof文件,以供JProfiler识别
运行之后会出现一个hprof文件
在资源管理器中使用JProfiler打开
点击BiggestOjbects(一般我喜欢使用BiggestOjbects),之后我们可以分析出,是ArrayList出错了,他占用的体积太大了.
之后我们点开线程Thread的main方法,可以看到13行代码出错,这就是OOM的根本原因
除此之外,我们还可以DumpOn其他的错误如下
下一篇:
数据结构与算法之递归