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

158
27 февраля 2019, 02:20

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

Два вопроса:

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

  2. От чего зависит продолжительность работы программы?

Запускал на 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<Monkey> 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<Solution> heap = new ArrayList<Solution>(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");
        }
    }
}
Answer 1

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

READ ALSO
Не сколлится меню

Не сколлится меню

Колллеги, делаю сайтПочему-то не скроллится меню в мобильной версии от 320 до 425 - как буд-то выставлена где-то захардкоженная высота

189
Как сверстать такой заголовок?

Как сверстать такой заголовок?

Подскажите, как сверстать такой заголовок, с двум линиями с боку, только чтоб линии при уменьшении экрана не уплывали

217
Правильная организация наследования

Правильная организация наследования

Пытаюсь организовать наследование такого типа (Напиток > Алкогольный/Без алкогольный > Пиво/Вода (к определенным функциям))

178