符合垃圾收集条件的对象

时间:2013-04-16 06:43:56

标签: java garbage-collection

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
  } 
} 

当达到此处时,garbage collector有多少个对象符合条件? 为什么?

4 个答案:

答案 0 :(得分:1)

可以清理四个物体。有两个不再引用的Icelandic个对象和两个Long个对象。还可以引用一个Iceic和一个Long以及String []。

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

顺便说一句:我不知道Icelandic是一种马。也许IcelandicHorse可能不那么令人困惑。

答案 1 :(得分:1)

在以下情况下,对象有资格在Java中进行垃圾收集:

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

通常,如果某个对象无法从任何实时线程任何静态引用访问,则该对象符合GC条件。

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

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

现在我们可以说x设置为 null

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

然后没有更多引用指向X,因此它符合GC的条件。

请注意,如果有另一个变量(例如x2)指向X,那么<{1}}设置为{<1}}后,不符合GC null ,因为x仍会指向它。

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

答案 2 :(得分:0)

可以收集2个冰岛实例,因为只引用了第二个实例。同样适用于长重量。您可以使用VisualVM监视对象分配,手动激活GC并查看剩下的内容。

答案 3 :(得分:0)

两个对象有资格进行垃圾回收,因为考虑到您仍在此范围内的事实。

i1 创建的对象&amp; i3 有资格进行垃圾回收 由 i2 创建的对象不符合条件。

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

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