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
扫一扫,关注我