2

这个问题就像我之前的一个问题 :

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 行时,有多少对象符合垃圾收集器的条件?

A. 0

B. 1

C. 2

D. 3

E. 4

F. 6

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

4

2 回答 2

8

让我们称在as和中创建的三个Icelandic对象。mainABC

初始

  • i1=A,i2=Bi3=C;

i3 = i1

  • i1=A,i2=Bi3=A;

i1 = i2

  • i1=B,i2=Bi3=A;

之后i2 = null

  • i1=B,i2=nulli3=A;

i3 = i1

  • i1=B,i2=nulli3=B

在第 14 行,存在B对类型对象的常规引用IcelandicAC在运行程序中丢失。

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

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

于 2012-09-02T09:42:43.337 回答
2

如果你仔细看,所有的赋值到底i1i3指向第二个对象,而i2指向null. 这意味着两个Icelandic对象有资格进行 GC。

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

一旦你离开了 all和声明的范围i1,剩下的两个对象也有资格进行 GC。i2i3

于 2012-09-02T09:35:22.543 回答