1. 程式人生 > >OutOfMemoryError/OOM/內存溢出異常實例分析--堆內存異常

OutOfMemoryError/OOM/內存溢出異常實例分析--堆內存異常

imp 分析工具 util jvm 內存映像 圖片 工具 操作 最大

Java堆內存溢出

只要不斷創建對象,並且保證GC Roots到對象之間有可達路徑來避免垃圾回收機制清除這些對象,

那麽在對象數量到達最大堆的容量限制後就會產生內存溢出異常,代碼如下:

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

public class HeapOOM {

    static class OOMObject {

    }

    public static void main(String[] args) {
        List<OOMObject> list = new ArrayList<>();
        
while (true) { list.add(new OOMObject()); } } }

在運行的時候,需要設置一下Java堆的大小,並且不可擴展,操作如下:

技術分享圖片

然後填寫JVM啟動參數:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

限制Java堆大小20m,最大值和最小值一致就達到不可擴展的目的了,-XX:+HeapDumpOnOutOfMemoryError參數可以讓虛擬機在出現

內存溢出異常時Dump出當前的內存轉儲快照以便事後分析。(感興趣的可以使用內存映像分析工具Eclipse Memory Analyzer打開堆轉儲快照文件進行分析)

技術分享圖片

運行結果如下:

技術分享圖片

OutOfMemoryError/OOM/內存溢出異常實例分析--堆內存異常