1、编写代码,像下面代码这样,产生OOM,
private static final Integer K = 1024;/*** 死循环,验证JVM调优* @return*/@GetMapping(value = "/deadLoop")public void deadLoop(){int size = K * K * 8;List<byte[]> list = new ArrayList<>();for (int i = 0; i < K; i++) {log.info("deadLoop"+i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}list.add(new byte[size]);}}
调用接口
Idea里面启动参数如下配置:
添加一个vm options,添加如下配置
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\workspace\hmblogs
产生OOM时,console打印了,dump文件在哪里
2、拿到hprof文件后,放到mat工具里面查看结果
2.1下载MAT,下载地址:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation
我电脑里是JDK8,建议下载1.0.0的版本
MemoryAnalyzer-1.0.0.20100520-win32.win32.x86_64.zip
2.2安装好MAT后,点击菜单File-->Open Heat Dump...
然后选择刚才产生的hprof文件,有个Overview视图,
然后来到了这里
查看到了是java.lang.Object[]关键字,点击了Details后,往下拉
找到Thread Stack
这个可展开收缩的项,找到问题出在哪一行了