我有以下代码:
class Test {
public static void main(String[] args) {
String a,b,c;
a = new String(args[0]);
b = a;
a = null;
b = null;
}
}
有人可以告诉我什么时候有资格进行垃圾收集。我认为这是在 b 设为 null 之后,因为 a 和 b 不引用同一个对象吗?
我有以下代码:
class Test {
public static void main(String[] args) {
String a,b,c;
a = new String(args[0]);
b = a;
a = null;
b = null;
}
}
有人可以告诉我什么时候有资格进行垃圾收集。我认为这是在 b 设为 null 之后,因为 a 和 b 不引用同一个对象吗?
new String(args[0]);
一旦不再有对它的任何引用,您创建的对象, 将有资格被收集。因此,让我们逐步执行代码:
a = new String(args[0]);
a
指向您的字符串,它不符合收集条件。
b = a;
a
并b
指向您的字符串,不符合条件。
a = null;
b
指向您的字符串,不符合条件。
b = null;
没有引用您的字符串,垃圾收集器很高兴!
也投出我的答案。正如其他答案所说,一旦不再可访问 String/ 对象(您不再拥有它的句柄),它就可用于垃圾收集。
所以如果你有一个单向链表......[1] -> [2] -> [3]
并且你有一个句柄[1]
(它有一个句柄[2]
)。如果您将句柄设置[1]
为 null,您会将整个列表提供给垃圾收集器。正如这个答案所说,您可以调用 System.gc() 来请求垃圾收集器运行,但不能保证它会。
我相信这个答案的主要焦点是当对象无法访问时垃圾收集器可以使用对象,这并不一定意味着没有对它的引用。在我上面的例子中,即使有,[1]
的句柄也可用于垃圾收集器,因为没有.[2]
[2]
[1]
你是什么意思a
?a
是一个参考,只有对象被垃圾收集。
a
当, 然后引用的字符串b
不再引用它时,它就有资格进行垃圾收集。在这种情况下,这是在对字符串 (a
和b
) 的两个引用都已更改为引用其他内容之后;在这种情况下,null
。
您必须根据分配的对象进行推理:一旦您将和String
都无效,任何人都不会引用您分配的。从那时起,垃圾收集器有权完成其工作。a
b
class Test {
public static void main(String[] args) {
String a,b,c; // you dont have objects yet
a = new String(args[0]); // here u make a new object
b = a; // b references to the same object as a
a = null; // a points to null, reference is removed.
b = null; // b point to null, reference is removed
}
}
在您的程序中,创建并分配给 a 和 b 的对象将在删除引用后被垃圾收集。
垃圾收集器将清理没有根且未被任何东西引用的对象。