关于java:性能测试之JVM的故障排查堆内存泄漏

11次阅读

共计 892 个字符,预计需要花费 3 分钟才能阅读完成。

JVM 异样阐明(超链接)一文中已介绍了,JVM 每个运行时区域——程序计数器、Java 虚拟机栈、本地办法栈、Java 堆、办法区、间接内存产生 OutOfMemoryError 的不同起因和不同错误信息。

Java 堆,是线程共享内存,简直所有的对象实例以及数组都应在堆上调配。如下堆的内存透露谬误也是咱们经常遇到的

java.lang.OutOfMemoryError: Java heap space

工具 VisualVM 的介绍

应用 VisualVM 排查堆内存透露

  1. 查看 GC

老年代 Old 和年老代 Eden 区在一直增长,简直已满。Full GC 次数增多,内存没有无效开释。这是内存透露的显著迹象

  1. 查看系统日志

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

  1. 剖析 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

扫一扫,关注我

正文完
 0