java中的垃圾收集器

java中的垃圾收集器,java,garbage-collection,Java,Garbage Collection,//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;

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

其中两个

x2 = new X2();
使以前的连接冗余。如果
x2
不在其他地方使用,则连接将丢失,垃圾收集器将从内存中删除它

x3 = x2;

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

至少两个,可能全部三个。因为在第11行之后不使用局部变量,所以它们有资格进行垃圾收集。根据JLS 12.6.1:

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


这在Hotspot JVM的实践中是可以观察到的(参见示例)。

我想这个问题是几天前提出的(并删除了)。一个经典的考试/面试问题。不是真正的编程。告诉我们您的想法,我们将讨论它。因为
doComplexStuff()
可以做任何事情,所以这个问题没有明确的答案。备选答案:
docomplextuff
是一个未知符号=>编译错误=>最初创建的零对象。:-)所有您不再有引用的对象。是的,答案是“视情况而定”