垃圾收集器问题

时间:2012-09-02 09:23:26

标签: java garbage-collection scjp

这个问题就像我之前的one 给出:

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

     

B中。 1

     

℃。 2

     

d。 3

     

电子。 4

     

F。 6

我选择了A,但正确答案是E,但我不知道为什么?

2 个答案:

答案 0 :(得分:8)

让我们将Icelandic中创建的三个main对象称为ABC

Initialy

  • i1=Ai2=Bi3=C;

i3 = i1之后

  • i1=Ai2=Bi3=A;

i1 = i2之后

  • i1=Bi2=Bi3=A;

i2 = null之后:

  • i1=Bi2=nulli3=A;

i3 = i1之后

  • i1=Bi2=nulli3=B

在第14行中,只有BIcelandic对象的常设引用。正在运行的程序中丢失了AC

丢失的每个Icelandic对象都会为垃圾收集器提供两个要收集的对象,即。 Icelandic对象本身和每个Long内的Icelandic对象,这使得垃圾收集对象的总数 4

由于永远不会调用makeNoise方法,因此它们不会改变结果。

答案 1 :(得分:2)

如果仔细观察,最后的所有作业i1i3指向第二个对象,而i2指向null。这意味着两个Icelandic个对象符合GC的条件。

每个Icelandic对象包含一个Long,这使得4个对象总共符合GC的条件。有趣的是,如果常量为12L,则由于2内部常量缓存,答案为:Long。另请注意,"whinny""vinny"来自常量池,不会被垃圾回收。

一旦您离开宣传所有i1i2i3的范围,剩下的两个对象也有资格获得GC。