JAVA堆溢出

前言:

看到學校課程q羣裏面有個同學說遇到oom問題怎麼辦,然後有一個同學給出了分析dump文件,這讓我回想當時看深入理解jvm這本書的時候也看到了相關的例子,不過當時沒有跟着操作下去。現在來補一補

實現內存泄漏導致java堆溢出

配置vm參數

在這裏插入圖片描述
-Xms20m 堆的最小值
-Xmx20m 堆的最大值 避免堆自動擴展
-XX:+HeapDumpOnOutOfMemoryError 發生堆溢出的時候生成dump文件以便與後面分析

java代碼:

// vm args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
public class HeapOOM {
    static class OOMobject{

    }
//    Java heap space java堆空間
    public static void main(String[] args) {
        List<OOMobject> list=new ArrayList<OOMobject>();
        while (true){
            list.add(new OOMobject());
        }
    }
}

結果

在這裏插入圖片描述
上方代碼不斷生成oomObject對象,通過一個list保持對於這些對象的引用,而list這個集合對象是虛擬機棧中幀棧的一個引用對象(gc roots),所以這些oomobject對象在堆內存滿,無法再分配對象的時候發起的minor gc和full gc中不會被清除,到時堆無足夠空間,到時堆溢出。

使用jprofiler來分析dump文件

配置了-XX:+HeapDumpOnOutOfMemoryError 會在堆溢出的時候自動生成dump文件,在項目的目錄下,不過idea貌似不會顯示,害我找了挺久的。
隨後找了找網上如何分析,發現都是用eclipse的一個插件分析,我用的是idea所以也沒有搞了,不過找到了一個蠻不錯的jprofiler。
直接用jprofiler打開dump文件
在這裏插入圖片描述
簡單明確,直接指出佔用過多空間的對象的類型。

總結

這只是一個小小的實驗來模擬堆溢出的情景,相當於回顧了一下jvm的垃圾收集吧。附上一些常用參數https://blog.csdn.net/denggouya9281/article/details/101223948

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