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