Выпуск сборщика мусора
Этот вопрос похож на мой предыдущий
3. interface Animal { void makeNoise(); }
4. class Horse implements Animal {
5. Long weight = 1200L;
6. public void makeNoise() { System.out.println("whinny"); }
7. }
8. public class Icelandic extends Horse {
9. public void makeNoise() { System.out.println("vinny"); }
10. public static void main(String[] args) {
11. Icelandic i1 = new Icelandic();
12. Icelandic i2 = new Icelandic();
13. Icelandic i3 = new Icelandic();
14. i3 = i1; i1 = i2; i2 = null; i3 = i1;
15. }
16. }
Когда достигнута строка 14, сколько объектов подходит для сборщика мусора?
А. 0
Б. 1
C. 2
D. 3
Е. 4
F. 6
Я выбрал А, но правильный ответ - Е, но я не знаю Почему?
2 ответа
Давайте назовем три Icelandic
объекты, созданные в main
как A
, B
а также C
,
Initialy
i1=A
,i2=B
а такжеi3=C
;
После i3 = i1
i1=A
,i2=B
а такжеi3=A
;
После i1 = i2
i1=B
,i2=B
а такжеi3=A
;
После i2 = null
:
i1=B
,i2=null
а такжеi3=A
;
После i3 = i1
i1=B
,i2=null
а такжеi3=B
В строке 14 есть постоянные ссылки только на B
тип объекта Icelandic
, A
а также C
теряются в запущенной программе.
каждый Icelandic
потерянный объект дает сборщику мусора два объекта для сбора, т.е. Icelandic
сам объект и Long
объект в каждом Icelandic
, которые составляют общее количество собранных мусором объектов 4.
поскольку makeNoise
методы никогда не вызываются, они не меняют результат.
Если вы посмотрите внимательно, после всех заданий в конце i1
а также i3
указать на второй объект в то время как i2
указывает на null
, Это означает два Icelandic
объекты имеют право на GC.
каждый Icelandic
объект содержит один Long
что делает 4 объекта подходящими для GC всего. Интересно, если бы константа была 12L
ответ будет: 2
из-за Long
внутренний постоянный кеш. Также обратите внимание, что "whinny"
а также "vinny"
из постоянного пула и не будут собирать мусор.
Как только вы покидаете сферу, где все i1
, i2
а также i3
объявлены, остальные два объекта также имеют право на GC.