解决思路
-XX:+HeapDumpOnOutOfMemoryError
参数可以在发生 OOM 时自动进行 dump;jmap
命令可以手动 dump;- 可以使用 JDK 自带的工具 jvisualvm.exe 进行分析。
详细过程
1)写程序模拟内存耗尽从而发生 OOM
public class OomBugsHandlerImpl extends LoggerHandler implements BugsHandler {
private static final Integer K = 1024;
@Override
public void bug() {
int size = K * K * 10;
List<byte[]> list = new ArrayList<>();
for (Integer i = 0; i < K; i++) {
logger.info("JVM 写入数据 {} M", (i + 1) * 10);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
list.add(new byte[size]);
}
}
}
2)启动程序并开启 OOM 发生时自动 dump
-XX:+HeapDumpOnOutOfMemoryError
参数可以在发生 OOM 时自动进行 dump;
java -XX:+HeapDumpOnOutOfMemoryError -jar Bugs-App-v1.0-jar-with-dependencies.jar oom
- 发生 OOM 自动 dump。
- 手动 dump
jmap -dump:format=b,file=<dumpfile.hprof> <pid>
3)使用 jvisualvm.exe 进行实时分析
- 工具位于:JDK安装目录\bin 下,同时保证安装了 Visual GC 插件;
- 同时可以在监视窗口下查看堆使用情况;
- 直到发生 OOM。
4)使用 jvisualvm.exe 进行离线分析
- 将 dump 后的文件导入工具中进行分析;
- 通过分析得知是由于 byte 数组太多导致内存溢出。
5)使用其他工具分析
- MAT 工具
发布于 2020-08-01 18:00