java中的垃圾收集器

时间:2013-08-06 10:55:59

标签: java garbage-collection

// Java Code ..

class X2 
{
    public X2 x;
    public static void main(String [] args) 
    {
        X2 x2 = new X2();   /* Line 6 */
        X2 x3 = new X2();   /* Line 7 */
        x2.x = x3;
        x3.x = x2;
        x2 = new X2();
        x3 = x2;           /* Line 11 */
        doComplexStuff();
    }
}

行号后:11运行有多少对象符合垃圾回收的条件? 请给我链接以正确理解这个概念。

2 个答案:

答案 0 :(得分:1)

其中两个。

x2 = new X2();

使先前的连接变得多余。如果其他地方没有使用x2,则连接将丢失,垃圾收集器会将其从内存中删除。

x3 = x2;

这会将x3指向x2,从而省略x3的前一个值。如果垃圾收集器没有在其他任何地方使用,它也将被清理。

答案 1 :(得分:1)

至少有两个,可能是三个。由于在第11行JVM is free to set them to null之后没有使用局部变量,因此它们有资格进行垃圾收集。来自JLS 12.6.1:

  

可以设计优化程序的转换,以减少可达到的对象数量,使其少于可以被认为可达的对象数量。例如,Java编译器或代码生成器可以选择设置将不再用于null的变量或参数,以使得此类对象的存储可能更快地被回收。

在Hotspot JVM的实践中可以观察到这种情况(例如参见The JVM ate my variable!)。