JVM 异常说明 https://testerhome.com/articles/24259 一文中已介绍了,JVM 每个运行时区域——程序计数器 、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存发生 OutOfMemoryError 的不同原因和不同错误信息。


Java 堆,是线程共享内存,几乎所有的对象实例以及数组都应在堆上分配。如下堆的内存泄漏错误也是我们常常遇到的

java.lang.OutOfMemoryError: Java heap space

工具 VisualVM 的介绍

使用 VisualVM 排查堆内存泄漏

  1. 查看 GC
    老年代 Old 和年轻代 Eden 区在不断增长,几乎已满。Full GC 次数增多,内存没有有效释放。这是内存泄漏的明显迹象

  1. 查看系统日志

    已有 Full GC 的日志,紧接着开始报错 OutOfMemoryError

  2. 分析 Heap Dump

    导入 Dump 后,可以看到占用内存最大的类和实例——OOMMonitor 类中的 placeholder 变量



  1. 示例代码
public class OOMMonitor {
    static class OOMobject {
        public byte[] placeholder = new byte[64 * 1024];
    }
    public static void fillHeap(int num) throws InterruptedException {
        List<OOMobject> list = new ArrayList<OOMobject>();
        for (int i = 0; i < num; i++) {
            //稍作延时,令监视曲线的变化更加明显
            Thread.sleep(500);
            list.add(new OOMobject());
            System.out.println("Hello World");
        }
    }
    public static void main(String[] args) throws Exception {
        fillHeap(1000);
    }
}
  1. 示例 VM 配置参数
-Xms20m
-Xmx20m
-verbose:gc
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/heapdump.hprof

扫一扫,关注我


↙↙↙阅读原文可查看相关链接,并与作者交流