0
interface Animal { void makeNoise(); } 

class Horse implements Animal {
  Long weight = 1200L; 
  public void makeNoise() { System.out.println("whinny"); } 
} 

public class Icelandic extends Horse {

  public void makeNoise() { System.out.println("vinny"); } 
  public static void main(String[] args) { 
    Icelandic i1 = new Icelandic(); 
    Icelandic i2 = new Icelandic(); 
    Icelandic i3 = new Icelandic(); 
    i3 = i1; 
    i1 = i2;
    i2 = null;
    i3 = i1; 
    //<-- HERE
  } 
} 

到达 HERE 时,有多少对象符合条件garbage collector?为什么?

4

4 回答 4

1

可以清理四个对象。有两个Icelandic不再引用的对象和两个Long对象。一个冰岛语和一个 Long 和 String[] 仍然可以被引用。

注意:Java 的未来版本可能会像 1200L 这样自动装箱 Long,在这种情况下,答案将只是 2,因为 Long 仍会被引用。例如,您将示例更改Integer为答案将取决于命令行参数。

顺便说一句:我不知道冰岛语是一种马。也许IcelandicHorse会不那么令人困惑。

于 2013-04-16T07:00:36.677 回答
1

在以下情况下,对象可以在 Java 中进行垃圾回收:

  • 对象的引用设置为null
  • 对象是在块内创建的,一旦控制退出该块,引用就会超出范围。

一般来说,如果一个对象不能从任何活动线程任何静态引用中访问,它就有资格进行 GC 。

现在,在澄清这一点之后,您应该能够进行计算并回答问题。

      ____________________________________
     |            ___              ___    |
     |  x------->|:) |    y------>|:) |   |
     |           |_X_|            |_Y_|   |
     |____________________________________|  

现在让我们说x设置为null

     _____________________________________
    |            ___              ___     |
 null<------ x  |:( |     y----->|:) |    |
    |           |_X_|            |_Y_|    |
    |_____________________________________|

然后不再有指向 的引用X,因此它有资格进行 GC。

请注意,如果有另一个变量(例如x2)指向X,则在将其设置为null后它将符合 GC 条件,因为仍将指向它。xx1

在澄清后告诉我们您的想法,我们将讨论您的答案。

于 2013-04-16T07:00:56.880 回答
0

可以收集 2 个冰岛实例,因为仍然引用了第二个实例。长重量也是如此。您可以使用 VisualVM 监控对象分配,手动激活 GC 并查看剩下的内容。

于 2013-04-16T07:20:55.077 回答
0

通过考虑您仍在该范围内的事实,两个对象有资格进行垃圾回收。

i1 & i3创建的对象符合垃圾回收条件。i2
创建的对象不符合条件。

System.out.println(i3 == i1);  

打印true。两个引用都指向同一个对象。其他两个对象有资格进行垃圾回收。

于 2013-04-16T07:39:26.697 回答