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
这个可展开收缩的项,找到问题出在哪一行了