JVM堆溢出实例
堆溢出條件
要觀察堆溢出,要同時滿足兩個條件:
因為對象是在堆里面創建的,堆大小一定,一直創建對象就可以消耗完堆空間,同時,由于由于垃圾回收的存在,創建對象的時候也要保證對象不要被當做垃圾回收了,JVM使用可達性分析來判斷一個對象是否是垃圾。我們可以使用jvm參數來限制堆大小,可以將對象加入到List中,保持對象存活。
堆溢出代碼
package test.jvm;import java.util.ArrayList; import java.util.List;/**java堆溢出實例* 原理:java的堆是用來存放對象實例的,所以我們只要做到以下三點就可以使堆溢出:* 1、限制堆的大小,不可擴展* 2、不斷新建對象* 3、保持對象存活不被回收* 對應的,我們需要:* 1、改變JVM的啟動參數,將堆的最小值和最大值設成一樣,這樣就可以避免堆自動擴展(其實不一樣也可以)* 2、不斷產生對象* 3、使用一個List來保存對象,保持對象存活* * JVM配置參數: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError* @author luchu**/ public class JVMLearnning01 {static class OOMObject{}public static void main(String[] args){JVMLearnning01 hello = new JVMLearnning01();List<OOMObject> list = new ArrayList<>();while(true){list.add(new OOMObject());}}}上面的代碼要產生堆溢出,要先配置jvm啟動參數,run as –> run configration 里可以配置。
上面幾個人參數的意思是:
-Xms20m -Xmx20m : 堆的最大最小值都是20m,避免自動擴展。
XX:+HeapDumpOnOutOfMemoryError :讓虛擬機在出現堆溢出時dump當前內存堆轉儲快照,以便進行分析。分析可以使用Eclipse Memory analyzer進行。
學習《深入淺出Java虛擬機》 周志明版 2.4章
總結
- 上一篇: 国内可用语料库
- 下一篇: [Java核心技术(卷Ⅰ)] - 判断相