关于GC的问题

时间:2010-04-26 14:05:08

标签: java

这是从java考试中获得的问题,

#1有多少个对象有资格进行gabage收集?

public class Main   {

Integer x = 32768;
public static void main(String[] args)
{ 
    Main m = new Main();
    m = null;
    // #1
  } 
}

我认为它只是收集整数x,GC甚至收集主要对象m?

6 个答案:

答案 0 :(得分:5)

是的,它确实收集了主要对象。由于整数本身既不是一个单独的对象(它是Main的成员)而不是指针,它不会被单独收集,而只是作为Main的一部分收集。

答案 1 :(得分:3)

垃圾收集器可能会删除两个对象。

分配给m的对象不再可用,Main中也没有。

编辑:您可以问自己:“此时我是否有可能以某种方式访问​​该对象?”如果回答是“否”,垃圾收集器可能会删除它。

答案 2 :(得分:2)

您可能遇到的一点困惑是,即使存在主要对象,也可以调用main方法。那是因为它是一种静态方法。类似地,“整数x”仅作为主对象中的字段存在。因此,当您创建一个新的Main对象时,您还可以创建整数m.x作为m的一部分。然后,当你将m设置为null时,之前由m引用的对象是垃圾并且可以被收集。

现在,什么时候收集它是一个完全不同的问题。真的没有保证;然而,由于它的使用是如此本地化,几乎可以肯定在下一个次要的收集/清除/挑选你最喜欢的术语。

答案 3 :(得分:1)

可以。没有任何参考,所以它有资格进行垃圾收集。

答案 4 :(得分:0)

Main的实例有资格进行垃圾回收,通常整数也符合条件。但是,如果配置为Integer类,也可以缓存Integer实例(请参阅this answer)。

使用Integer#valueOf(int)(用于自动装箱)时,通常只会缓存介于-128和127之间的整数,但可以通过设置系统属性java.lang.Integer.IntegerCache.high

来增加上限

答案 5 :(得分:0)

我使用最近的一个OpenJDK的观察表明,只有一个方法退出做任何引用,它实际上是孤立的。我根本没想到这一点,但事情发生了。将这些代码行提取到另一个方法中,然后返回main(), 允许收集实例。

我认为这是一个愚蠢的问题。 (编辑:我的意思是考试问题!不是侮辱提交者!)这就是你如何定义“合格”的。在我的情况下,我会说一旦没有引用,实例就是符合条件的被收集,只是它实际上 收集它直到方法返回。