JVM異常說明(超鏈接) 一文中已介紹了磅氨,JVM每個運行時區(qū)域——程序計數(shù)器 、Java虛擬機棧冒窍、本地方法棧、Java堆豺鼻、方法區(qū)综液、直接內存發(fā)生OutOfMemoryError的不同原因和不同錯誤信息。
Java堆儒飒,是線程共享內存谬莹,幾乎所有的對象實例以及數(shù)組都應在堆上分配。如下堆的內存泄漏錯誤也是我們常常遇到的
java.lang.OutOfMemoryError: Java heap space
工具VisualVM的介紹
使用VisualVM排查堆內存泄漏
- 查看GC
老年代Old和年輕代Eden區(qū)在不斷增長,幾乎已滿附帽。Full GC次數(shù)增多埠戳,內存沒有有效釋放。這是內存泄漏的明顯跡象
-
查看系統(tǒng)日志
已有Full GC的日志蕉扮,緊接著開始報錯OutOfMemoryError
分析Heap Dump
導入Dump后整胃,可以看到占用內存最大的類和實例——OOMMonitor類中的placeholder變量
- 示例代碼
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++) {
//稍作延時,令監(jiān)視曲線的變化更加明顯
Thread.sleep(500);
list.add(new OOMobject());
System.out.println("Hello World");
}
}
public static void main(String[] args) throws Exception {
fillHeap(1000);
}
}
- 示例VM配置參數(shù)
-Xms20m
-Xmx20m
-verbose:gc
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/heapdump.hprof
公號:大道測試