为什么无限对象创建不会抛出OutOfMemoryError?

时间:2019-05-13 06:07:26

标签: java java-8 garbage-collection out-of-memory

为什么我的以下代码没有出现OutOfMemoryError?

class OutOfMemoryErrorTest{

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

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

我正在使用Java 8。

3 个答案:

答案 0 :(得分:1)

该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。

答案 1 :(得分:0)

因为您没有保存对象引用,所以垃圾收集器将删除创建的对象。如果将这些对象添加到列表中,它将发生。

答案 2 :(得分:0)

所以首先,它只是被垃圾收集器删除,因为您是在循环中创建它。其次,可能是您有太多的内存以至于您只需要等待很长时间。因此,当您修复垃圾收集器的东西时,您可能会等待很长时间。试试我在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);
        }
    }

}