首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java垃圾收集如何与循环引用一起工作?

Java垃圾收集如何与循环引用一起工作?
EN

Stack Overflow用户
提问于 2009-12-16 04:33:33
回答 3查看 56.2K关注 0票数 174

据我所知,Java中的垃圾回收会在没有其他对象“指向”的情况下清理一些对象。

我的问题是,如果我们有这样的东西会发生什么:

代码语言:javascript
复制
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

abc应该是垃圾回收的,但它们都被其他对象引用。

Java垃圾收集是如何处理这个问题的?(或者仅仅是内存消耗?)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-16 04:35:22

Java的GC认为,如果对象不能通过从垃圾收集根开始的链访问,那么这些对象就是“垃圾”,因此这些对象将被收集。即使对象可能彼此指向形成一个循环,但如果它们从根上被切断,它们仍然是垃圾。

请参阅附录A:Java Platform Performance: Strategies and Tactics中关于垃圾回收的真相中关于不可达对象的章节,以了解更多的细节。

票数 172
EN

Stack Overflow用户

发布于 2009-12-16 04:39:14

垃圾收集通常并不意味着“当没有其他对象‘指向’某个对象时清除该对象”(这就是引用计数)。垃圾收集大体上是指查找程序无法访问的对象。

因此,在您的示例中,在a、b和c超出作用域之后,它们可以由GC收集,因为您不能再访问这些对象。

票数 1
EN

Stack Overflow用户

发布于 2009-12-16 04:43:32

比尔直接回答了你的问题。正如Amnon所说,您对垃圾收集的定义只是引用计数。我只想补充说,即使是非常简单的算法,如标记和清除以及复制集合,也很容易处理循环引用。所以,它没有什么神奇之处!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1910194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档