-6

//Java代码..

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 行运行后,有多少对象符合垃圾回收条件?请给我链接以正确理解这个概念。

4

2 回答 2

1

至少两个,可能所有三个。由于在第 11 行之后没有使用局部变量,JVM 可以自由地将它们设置为null,并且它们有资格进行垃圾收集。从 JLS 12.6.1 开始:

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

这可以观察到在 Hotspot JVM 上的实践中发生(例如,参见The JVM ate my variable!)。

于 2013-08-06T11:17:23.987 回答
1

他们两个人。

x2 = new X2();

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

x3 = x2;

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

于 2013-08-06T11:00:58.793 回答