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變數



- 示例代碼
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);
}
}
- 示例VM配置引數
-Xms20m
-Xmx20m
-verbose:gc
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/heapdump.hprof
掃一掃,關注我

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/186036.html
標籤:其他
下一篇:系統集成專案管理工程師高頻考點
