Страницы

Поиск по вопросам

вторник, 17 декабря 2019 г.

Почему возникает исключение OutOfMemoryError?

#java #сборщик_мусора


Работает пока GC не удалит объект, на который есть только "мягкая" (monkey) ссылка. 

Два вопроса:


Почему иногда вылетает OutOfMemoryError, а иногда нет? Вылетает тогда, когда GC не
справляется со своей работой или я что-то не так понял? 
От чего зависит продолжительность работы программы?


Запускал на 3-х компах по 5-7 раз:


на одном ПК работает ~150сек(всегда вылетает OutOfMemoryError), 
на втором ПК работает по ~450-500сек(иногда не вылетает, OutOfMemoryError),
на третьем ПК работает ~60сек(всегда вылетал OutOfMemoryError).


На всех ПК по 8гб оперативной памяти.

public class Solution {
    public static Helper helper = new Helper();

    public static class Monkey {
        private String name;

        public Monkey(String name) {
            this.name = name;
        }

        @Override
        protected void finalize() {
            Helper.isFinalized = true;
            System.out.format("Bye-Bye, %s!\n", name);
        }
    }

    public static void main(String args[]) throws InterruptedException {
        helper.startTime();

        Monkey monkey = new Monkey("Simka");

        SoftReference reference = new SoftReference<>(monkey);

        helper.callGC();

        monkey = null;

        helper.callGC();
        helper.heapConsuming();

        if (reference.get() == null)
            System.out.println("Finalized");

        helper.finish();
    }

    public static class Helper {
        public static boolean isFinalized;

        private long startTime;

        void startTime() {
            this.startTime = System.currentTimeMillis();
        }

        int getTime() {
            return (int) (System.currentTimeMillis() - startTime) / 1000;
        }

        void callGC() throws InterruptedException {
            System.gc();
            Thread.sleep(1000);
        }

        void heapConsuming() {
            try {
                List heap = new ArrayList(100000);
                while (!isFinalized) {
                    heap.add(new Solution());
                }
            } catch (OutOfMemoryError e) {
                System.out.println("Out of memory error raised");
            }
        }

        public void finish() {
            System.out.println("Done");
            System.out.println("It took " + getTime() + " sec");
        }
    }
}

    


Ответы

Ответ 1



Дюк, вынеси мусор Вот ссылка. Можно прочесть весь цикл статей, про все сборщики мусора, которые предоставляет Java HotSpot VM. Оттуда станет понятно, когда запускается сборщик мусора, как работает, и немного станет яснее о внутреннем устройстве разных GC.

Комментариев нет:

Отправить комментарий