Почему создание бесконечного объекта не вызывает OutOfMemoryError? - PullRequest
3 голосов
/ 13 мая 2019

Почему я не получаю OutOfMemoryError с кодом ниже?

class OutOfMemoryErrorTest{

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

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

Я работаю с Java 8.

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Объект будет помечен как доступный после каждого цикла, поэтому он будет собран.

    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.

0 голосов
/ 13 мая 2019

Итак, во-первых, он просто удаляется сборщиком мусора, потому что вы создаете его в цикле. Во-вторых, у вас может быть столько памяти, что вам просто нужно долго ждать. Поэтому, когда вы починили сборщик мусора, вы можете долго ждать. Попробуйте этот код, который я нашел на 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);
        }
    }

}
0 голосов
/ 13 мая 2019

Поскольку вы не сохранили ссылку на объект, сборщик мусора удалит созданные объекты. если вы добавите эти объекты в список, то это произойдет.

...