Loading...
墨滴

fushoujiang

2021/12/01  阅读:46  主题:兰青

jvisualvm分析堆内存溢出

内存溢出代码

// FileName: HeapOOM.java
/**
 * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
 */

public class HeapOOM {

    private static class HeapOomObject {
        int[] ints =new int[1024*1024];
    }
    public static void main(String[] args) {
        List<HeapOomObject> list = new ArrayList<HeapOomObject>();
        while (true) {
            list.add(new HeapOomObject());
        }
    }
}

JVM 参数设置

1.增加 vm 参数设置框

2.参数拷贝-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=

启动运行程序

1.日志

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid5182.hprof ...
Heap dump file created [18858670 bytes in 0.121 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 at com.example.yangjie.jvm.HeapOOM$HeapOomObject.<init>(HeapOOM.java:13)
 at com.example.yangjie.jvm.HeapOOM$HeapOomObject.<init>(HeapOOM.java:12)
 at com.example.yangjie.jvm.HeapOOM.main(HeapOOM.java:18)

Process finished with exit code 1

2.-XX:+HeapDumpOnOutOfMemoryError 参数设置是将 dump 日记记录到项目的根目录如下图所示

使用 java 自带工具 jvisualvm 分析

1.工具目录在 jdk bin 路径下直接在终端打开

/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/jvisualvm

2.导入 hprof 文件

3.选择[类] 按照大小排序 3

发现 int[] 数组占用 90+%,可以看出来和代码中是一致的

4.继续深入分析,在选中的 int[]双击选择[在实例视图中显示],效果如下

5.然后查看引用 int[]->HeapOOM&HeapOOMObject->Object[]->ArrayList

总结

一、当程序发生 OOM 异常时自动打印 dump 日志

二、JDK自带dump分析工具jvisualvm的简单使用

fushoujiang

2021/12/01  阅读:46  主题:兰青

作者介绍

fushoujiang