java中的垃圾收集器
//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;
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
是一个未知符号=>编译错误=>最初创建的零对象。:-)所有您不再有引用的对象。是的,答案是“视情况而定”