簡體   English   中英

為什么無限對象創建不會拋出OutOfMemoryError?

[英]Why is infinite object creation not throwing OutOfMemoryError?

為什么我沒有使用以下代碼獲取OutOfMemoryError?

class OutOfMemoryErrorTest{

    public static void main(String[] args){
        Object obj;

        while(true){
            obj = new Object();
        }
    }
}

我正在運行Java 8。

每次循環后,obj將被標記為可收集,因此將被收集。

    while(true){
        Object obj = new Object(); //no further reference, so obj will be collected
    }

如果需要測試OOM,則應將obj的引用保存到LinkedList。

    List refs = new LinkedList();
    while (true) {
        Object obj = new Object();
        refs.add(obj);
    }

然后你會得到你想要的OOM。 並且您可以使用較小的堆來更快地到達OOM。

因為您沒有保存對象引用,所以垃圾收集器刪除創建的對象。 如果你將這些對象添加到List,那么它將會發生。

首先,它只是被垃圾收集器刪除,因為你在循環中創建它。 其次,你可能有很多記憶,你只需要等待很長時間。 因此,當你修復垃圾收集器時,你可能需要等待很長時間。 試試我在https://crunchify.com/how-to-generate-out-of-memory-oom-in-java-programatically/上找到的代碼

package test;

public class OutOfMemoryErrorTest {

    /**
     * @author Crunchify.com
     * @throws Exception
     * 
     */

    public static void main(String[] args) throws Exception {
        OutOfMemoryErrorTest memoryTest = new OutOfMemoryErrorTest();
        memoryTest.generateOOM();
    }

    public void generateOOM() throws Exception {
        int iteratorValue = 20;
        System.out.println("\n=================> OOM test started..\n");
        for (int outerIterator = 1; outerIterator < 20; outerIterator++) {
            System.out.println("Iteration " + outerIterator + " Free Mem: " + Runtime.getRuntime().freeMemory());
            int loop1 = 2;
            int[] memoryFillIntVar = new int[iteratorValue];
            // feel memoryFillIntVar array in loop..
            do {
                memoryFillIntVar[loop1] = 0;
                loop1--;
            } while (loop1 > 0);
            iteratorValue = iteratorValue * 5;
            System.out.println("\nRequired Memory for next loop: " + iteratorValue);
            Thread.sleep(1000);
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM