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 次数增多,内存没有有效释放。这是内存泄漏的明显迹象

测试能力提升 性能测试之 JVM 的故障排查-堆内存泄漏

 

 1.查看系统日志

测试能力提升 性能测试之 JVM 的故障排查-堆内存泄漏

 

2. 分析 Heap Dump

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

测试能力提升 性能测试之 JVM 的故障排查-堆内存泄漏

 

 

测试能力提升 性能测试之 JVM 的故障排查-堆内存泄漏

 

 测试能力提升 性能测试之 JVM 的故障排查-堆内存泄漏

 

 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

测试能力提升 性能测试之 JVM 的故障排查-堆内存泄漏

 

相关文章: