据我所知,Java中的垃圾回收会在没有其他对象“指向”的情况下清理一些对象。
我的问题是,如果我们有这样的东西会发生什么:
class Node {
public object value;
public Node next;
public Node(object o, Node n) { value = 0; next = n;}
}
//...some code
{
Node a = new Node("a", null),
b = new Node("b", a),
c = new Node("c", b);
a.next = c;
} //end of scope
//...other code
a
、b
和c
应该是垃圾回收的,但它们都被其他对象引用。
Java垃圾收集是如何处理这个问题的?(或者仅仅是内存消耗?)
发布于 2009-12-16 04:35:22
Java的GC认为,如果对象不能通过从垃圾收集根开始的链访问,那么这些对象就是“垃圾”,因此这些对象将被收集。即使对象可能彼此指向形成一个循环,但如果它们从根上被切断,它们仍然是垃圾。
请参阅附录A:Java Platform Performance: Strategies and Tactics中关于垃圾回收的真相中关于不可达对象的章节,以了解更多的细节。
发布于 2009-12-16 04:39:14
垃圾收集通常并不意味着“当没有其他对象‘指向’某个对象时清除该对象”(这就是引用计数)。垃圾收集大体上是指查找程序无法访问的对象。
因此,在您的示例中,在a、b和c超出作用域之后,它们可以由GC收集,因为您不能再访问这些对象。
发布于 2009-12-16 04:43:32
比尔直接回答了你的问题。正如Amnon所说,您对垃圾收集的定义只是引用计数。我只想补充说,即使是非常简单的算法,如标记和清除以及复制集合,也很容易处理循环引用。所以,它没有什么神奇之处!
https://stackoverflow.com/questions/1910194
复制相似问题