JVM的堆記憶體泄漏排查-性能測試

JVM異常說明 //testerhome.com/articles/24259 一文中已介紹了,JVM每個運行時區域——程式計數器 、Java虛擬機棧、本地方法棧、Java堆、方法區、直接記憶體發生OutOfMemoryError的不同原因和不同錯誤資訊。

Java堆,是執行緒共享記憶體,幾乎所有的對象實例以及數組都應在堆上分配。如下堆的記憶體泄漏錯誤也是我們常常遇到的

java.lang.OutOfMemoryError: Java heap space

工具VisualVM的介紹

使用VisualVM排查堆記憶體泄漏

  1. 查看GC

    老年代Old和年輕代Eden區在不斷增長,幾乎已滿。Full GC次數增多,記憶體沒有有效釋放。這是記憶體泄漏的明顯跡象

  1. 查看系統日誌

    已有Full GC的日誌,緊接著開始報錯OutOfMemoryError

  2. 分析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

掃一掃,關注我