Mar*_*ark 0 java garbage-collection
我对这段代码的垃圾收集资格有疑问.
public static void main(String[] args) {
Object a = new Object();
Object b = new Object();
Object c = new Object();
a = b;
b = c;
c = null;
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了几个Java垃圾收集的例子,我想我已经掌握了它.所以我想的是,c = null;只有这行才有c资格进行垃圾收集,因为它是唯一丢弃了对它的所有引用的对象.我在这儿吗?
谢谢!
在Java中,变量不符合垃圾回收的条件; 对象是.变量保存对象的引用,但不是对象本身.
让我们看一下您的示例,其中包含一些示例对象ID(JVM用于跟踪它们的内部标识符,通常不可见):
Object a = new Object(); // id=1
Object b = new Object(); // id=2
Object c = new Object(); // id=3
Run Code Online (Sandbox Code Playgroud)
您现在拥有对象1,2和3,每个对象都来自一个变量:a:1, b:2, c:3.当您在变量之间复制这些引用时,状态如下所示:
a = b; // a:2, b:2, c:3
b = c; // a:2, b:3, c:3
c = null; // a:2, b:3, c:null
Run Code Online (Sandbox Code Playgroud)
之后a = b,您丢失了对对象1的所有引用,该对象最初位于对象1中a,因此它立即有资格进行垃圾回收.对象2和3仍然可以到达块的末尾,其中所有变量都在一起超出范围.