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

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

java.lang.OutOfMemoryError:Java heap space
工具VisualVM的介绍
使用VisualVM排查堆内存泄漏

查看GC

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

查看系统日志

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

分析Heap Dump

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

示例代码

publicclassOOMMonitor{staticclassOOMobject{publicbyte[] placeholder =newbyte[64*1024];}publicstaticvoid fillHeap(int num)throwsInterruptedException{List<OOMobject> list =newArrayList<OOMobject>();for(int i =0; i < num; i++){//稍作延时,令监视曲线的变化更加明显Thread.sleep(500); list.add(newOOMobject());System.out.println(“Hello World”);}}publicstaticvoid main(String[] args)throwsException{ fillHeap(1000);}}

示例VM配置参数

-Xms20m

-Xmx20m

-verbose:gc

-XX:+PrintGCDetails

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/data/heapdump.hprof

扫一扫,关注我

发表回复

后才能评论