Java 垃圾收集器问题

Java 垃圾收集器问题,java,garbage-collection,scjp,Java,Garbage Collection,Scjp,这个问题和我以前的问题一样 鉴于: 当到达第14行时,有多少对象符合垃圾收集器的条件 A.0 B.1 C.2 D.3 E.4 F.6 我选择了A,但正确的答案是E,但我不知道为什么?如果你仔细看,最后所有的赋值i1和i3指向第二个对象,而i2指向null。这意味着两个冰岛对象符合GC的条件 每个Icelandic对象包含一个Long,总共有4个对象符合GC条件。有趣的是,如果常数是12L,答案将是:2,因为Long内部常数缓存。还要注意的是,“whinny”和“vinny”来自常量池,不会被垃圾

这个问题和我以前的问题一样 鉴于:

当到达第14行时,有多少对象符合垃圾收集器的条件

A.0

B.1

C.2

D.3

E.4

F.6


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

如果你仔细看,最后所有的赋值
i1
i3
指向第二个对象,而
i2
指向
null
。这意味着两个冰岛对象符合GC的条件

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


一旦您离开声明所有
i1
i2
i3
的范围,剩下的两个对象也符合GC的条件。

让我们将
main
中创建的三个
冰岛
对象称为
A
B
C

最初

  • 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
对象本身和每个
Icelandic
对象中的
Long
对象,这使得垃圾收集的对象总数为4


因为从来没有调用过
makeNoise
方法,所以它们不会改变结果。

我看不出这是怎么回事
E
,因为您只创建了三个对象实例(忽略了在
Icelandic
构造函数中创建的任何对象)。除非他们说
args
也是垃圾收集的候选对象,因为
main()
即将返回并终止程序。@vainolo它在13到15之间。:-)注意
weight
字段。它的类型是长的,所以它也是一个对象。冰岛语的两个实例被垃圾收集,它们的权重也被垃圾收集。如果“到达第14行时”表示第14行未执行,则0。如果不是这样的话,那么是4。@Tom-很公平,但这不就是重复计算吗?我想通过指出冰岛语的一个实例将被垃圾收集,这意味着该实例的所有字段也将被收集。尽管问题的作者似乎不同意。如果调用
makeNoise()
方法会有什么区别吗?@Tomasz Nurkiewicz:这取决于
System.out.println
的实现。我想我缺少了一条规则,我想当这个赋值执行i1=i2时,i1将同时引用a和B,但这似乎是错误的,当那个混蛋被执行时,i1不再指A,而只指B,这是真的吗?@Eslam:是的,这是正确的。引用将始终指向一个且仅指向一个对象。当你说
i1=x
i1
将不再指向它在赋值之前指向的任何对象,它将指向同样由
x
@junjanes:you's right,
System.out.println()
指向的对象,+1。
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. }