Java內存溢出排查過程

前言:

今天看到了敖丙的一篇關於排查堆內存溢出的博文,是自己沒有接觸過的知識,所以仿照過程自己也實驗了一遍學習這部分的一些知識!

首先我使用的是Windows電腦,所以查看堆空間的插件在這裏!
在這裏插入圖片描述

1、先看自己電腦的堆空間

在這裏插入圖片描述

2、下載Visual GC插件

在這裏插入圖片描述

3、執行相應的代碼測試堆空間

public class jvmController {
    private static final Integer K = 1024;
    public static void main(String[] args) {
        int size = K*K*8;
        List<byte[]> list = new ArrayList<>();
        for (int i = 0; i < K; i++) {
            System.out.println("寫入數據"+(i+1)+"M");
            try {
                Thread.sleep(1000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            list.add(new byte[size]);

        }
    }
}

4、通過Visual GC查看堆空間中的各個區域的佔用情況(Eden區、Survivor區、老年代區)

在這裏插入圖片描述

5、程序執行一段時間可以看到堆空間的佔用明顯上升

在這裏插入圖片描述

6、查看dump文件的位置,然後通過mat工具查看dump文件

下載mat
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

最後分析dump文件中出現的問題,已經定位到問題的所在。

通過執行代碼可以看到,執行到一定的次數就會出現OOM問題,此時程序也相應停止。
在這裏插入圖片描述

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