Макет сборки мусора для экзамена OCPJP

Четыре объекта имеют право на сборку мусора, когда i3 = null; выполняется в классе, показанном ниже. Я добавил комментарии, чтобы объяснить, как я получил этот ответ. Правильно ли мое рассуждение?

public class Icelandic extends Horse{
    public void makeNoise(){
        System.out.println("vinny");
    }

    public static void main(String args[]){
        /**
         * 2 objects created
         */
        Icelandic i1 = new Icelandic();

        /**
         * 2 objects created
         */
        Icelandic i2 = new Icelandic();

        /**
         * 2 objects created
         */
        Icelandic i3 = new Icelandic();

        /**
         * i3 is now pointing at i1, original Icelandic() referred to by i3 now
             * has no reference -  2 objects now have no reference
         */
        i3 = i1;

        /**
         * i3 is now pointing at i1, original Icelandic() referred to by i1 now
             * has no reference -  2 objects now have no reference
         */
        i1 = i2;

        /**
         * Total of six objects created, 4 objects no longer have a reference so 4
             * can be garbage collected.
         * 
         * Setting to null below doesn't make any difference to garbage collector
             * as objects now do not have a reference
         */
        i2 = null;
        i3 = null;
    }
}

interface Animal {
    void makeNoise();
}

class Horse implements Animal{
    Long weight = 1200L;

    public void makeNoise() {
        System.out.println("whinny");
    }    
}

2 ответа

Решение

Это шаги вашей программы:

    Icelandic i1 = new Icelandic();
    Icelandic i2 = new Icelandic();
    Icelandic i3 = new Icelandic();

    i3 = i1;
    i1 = i2;

    i2 = null;
    i3 = null;

Итак, последняя диаграмма показывает, что только 2 объекта готовы для сборки мусора. Я надеюсь, что я ясно. Вы можете видеть имена объектов как ссылки на объекты.

РЕДАКТИРОВАТЬ:

Как говорит BalusC, Long weight = 1200L также является объектом. Таким образом, еще 2 объекта каждый для i1 и i3 являются подходящими или сборщиками мусора. Таким образом, все 4 объекта имеют право или сборщик мусора.

Как очень простое практическое правило, объект в java можно собирать мусором, если поведение программы не изменится, если все поля объекта будут скопированы в локальные переменные (оптимизирующее преобразование программы), а все ссылки на объект будут установлены на ноль.

Цитирование "Java VM Spec"

12.6.1 Реализация финализации Каждый объект может характеризоваться двумя атрибутами: он может быть достижимым, достижимым для финализатора или недоступным, а также может быть незавершенным, финализируемым или финализированным.

Достижимый объект - это любой объект, к которому можно получить доступ в любом потенциальном продолжающемся вычислении из любого живого потока. Могут быть разработаны оптимизирующие преобразования программы, которые уменьшают число достижимых объектов до меньшего, чем те, которые наивно считаются достижимыми. Например, компилятор или генератор кода может выбрать установку переменной или параметра, которые больше не будут использоваться для обнуления, чтобы в будущем хранилище для такого объекта могло быть потенциально восстановимо.

обсуждение

Другой пример этого происходит, если значения в полях объекта хранятся в регистрах. Программа может затем получить доступ к регистрам вместо объекта и никогда не получить доступ к объекту снова. Это будет означать, что объект является мусором.

Так что в вашем случае, как ни одна из ссылок на любой из Icelandic объекты разыменовываются, все они могут быть немедленно собраны мусором. Как ничего разыменования i1 в i3оптимизирующий компилятор имеет право исключать все после i3 = new Icelandic() как неоперативный и немедленно собрать все шесть объектов.

Другие вопросы по тегам