我有以下代码:
class Test {
public static void main(String[] args) {
String a,b,c;
a = new String(args[0]);
b = a;
a = null;
b = null;
}
}
有人可以告诉我什么时候有资格进行垃圾收集。我认为这是因为不是a和b引用同一个对象,所以它是空的吗?
答案 0 :(得分:1)
您创建的对象new String(args[0]);
一旦不再有任何引用,就有资格进行收集。让我们逐步完成代码:
a = new String(args[0]);
a
指向您的字符串,它不符合收集资格。
b = a;
a
和b
指向您的字符串,不符合条件。
a = null;
b
指向您的字符串,不符合条件。
b = null;
没有引用你的String,Garbage Colelctor很高兴!
答案 1 :(得分:1)
也提出我的回答。正如其他答案所说,一旦不再可访问垃圾收集,它就可用于垃圾收集(你不再拥有它的句柄)。
因此,如果您有一个单向链接列表... [1] -> [2] -> [3]
并且您有一个[1]
句柄(其句柄为[2]
及以后)。如果将句柄设置为[1]
为null,则可以将整个列表提供给垃圾收集器。正如this answer所述,您可以调用System.gc()来请求垃圾收集器运行,但不能保证它会运行。
我认为这个答案的主要焦点是垃圾收集器在无法访问时可以使用这些对象,这并不一定意味着没有对它的引用。在上面的示例中,即使[1]
有[2]
句柄,但[2]
可用于垃圾收集器,因为[1]
没有句柄。
答案 2 :(得分:0)
a
你是什么意思? a
是引用,只有对象被垃圾回收。
a
引用的字符串,然后是b
,当没有任何引用它时,它有资格进行垃圾回收。在这种情况下,这是在对字符串(a
和b
)的引用都已更改为引用其他内容之后;在这种情况下,null
。
答案 3 :(得分:0)
您必须根据分配的对象进行推理:只要您同时取消String
和a
,{@ 1}}就不会引用您分配的b
。从那以后,垃圾收集者有权完成其工作。
答案 4 :(得分:0)
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的对象将在删除引用后进行垃圾回收。
垃圾收集器将清理没有根且没有被任何引用的对象。