JVM(一)初體驗-內存溢出問題分析及解決方案

1. 開始
創建Main類和Demo類,在Main類的main方法中創建List,並向List中無限創建Demo對象,造成堆內存溢出,
並輸出內存溢出錯誤文件在項目目錄下,爲了使等待時間減小,設置運行堆內存大小。
2. 創建Demo類
package com.cheng.test1;
/** 
 * @ClassName: Demo 
 * @Description: TODO
 * @author: Cheng
 * @date: 2018年4月24日 上午11:01:44  
 */
public class Demo {

}
3 創建Main類,造成堆內存溢出
package com.cheng.test1;

import java.util.ArrayList;
import java.util.List;

/** 
 * @ClassName: Main 
 * @Description: Java堆內存溢出
 * @author: Cheng
 * @date: 2018年4月24日 上午11:01:37  
 */
public class Main {

    /** 
     * @Title: main 
     * @Description: TODO 
     * @param args void
     * @author Cheng
     * @date 2018年4月24日上午11:01:37
     */
    public static void main(String[] args) {
        List<Demo> list = new ArrayList<>();
        // Java堆中用於存儲對象,通過不斷創建對象的方式可以造成堆內存溢出
        while (true) {
            // 將對象放入list中,使GC Roots到對象之間有可達路徑,防止垃圾回收機制清除new的對象
            list.add(new Demo());

        }
    }
}
4 運行 Run As ->Run Configurations

運行之前設置JVM參數:

-XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m

這裏寫圖片描述

會在項目的目錄下生成 java_pid3500.hprof 之類的文件

這裏寫圖片描述

1.1.5 使用Eclipse的MemoryAnalyzer(專業用於分析dump文件的工具,需要自行下載安裝)打開文件
分析結果:
這裏寫圖片描述

可以看到 com.cheng.test1.Demo 的對象造成堆內存溢出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章