1. 程式人生 > >JVM的堆記憶體洩漏排查-效能測試

JVM的堆記憶體洩漏排查-效能測試

JVM異常說明 https://testerhome.com/articles/24259 一文中已介紹了,JVM每個執行時區域——程式計數器 、Java虛擬機器棧、本地方法棧、Java堆、方法區、直接記憶體發生OutOfMemoryError的不同原因和不同錯誤資訊。
Java堆,是執行緒共享記憶體,幾乎所有的物件例項以及陣列都應在堆上分配。如下堆的記憶體洩漏錯誤也是我們常常遇到的 ``` java.lang.OutOfMemoryError: Java heap space ``` #### 工具VisualVM的介紹 #### 使用VisualVM排查堆記憶體洩漏 1. 檢視GC
老年代Old和年輕代Eden區在不斷增長,幾乎已滿。Full GC次數增多,記憶體沒有有效釋放。這是記憶體洩漏的明顯跡象 ![](https://ae01.alicdn.com/kf/H0bd00132a32f4f0392954541c39b8023P.jpg) 2. 檢視系統日誌
已有Full GC的日誌,緊接著開始報錯OutOfMemoryError ![](https://ae01.alicdn.com/kf/H83d8b5566d5241fe98a29724111587b0z.jpg) 3. 分析Heap Dump
匯入Dump後,可以看到佔用記憶體最大的類和例項——OOMMonitor類中的placeholder變數 ![](https://ae01.alicdn.com/kf/Hff8e2880d64e483da574fdbbfde4b76fs.jpg) ![](https://ae01.alicdn.com/kf/Hc4546b91ecba4fc0af56c24ca873c20bH.jpg) ![](https://ae01.alicdn.com/kf/H99218af8381340378617cfbb4532295fm.jpg) 4. 示例程式碼 ``` public class OOMMonitor { static class OOMobject { public byte[] placeholder = new byte[64 * 1024]; } public static void fillHeap(int num) throws InterruptedException {