Макет сборки мусора для экзамена OCPJP - PullRequest
1 голос
/ 25 ноября 2011

Четыре объекта имеют право на сборку мусора, когда 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 ]

12 голосов
/ 25 ноября 2011

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

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

enter image description here

    i3 = i1;
    i1 = i2;

enter image description here

    i2 = null;
    i3 = null;

enter image description here

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

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

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

1 голос
/ 25 ноября 2011

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

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

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

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

Обсуждение

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

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

...