垃圾收集中的连锁反应

时间:2012-09-20 01:23:38

标签: java garbage-collection

我在Java中有一个非常基本的问题。我到处搜索这个,但在任何地方找不到解决方案。

我正在尝试阅读有关删除二叉树的信息。在进入DFS,BFS等之前,我想如果我只是释放对树的根的所有活动引用,那么整个树应该自动获得GCed。我的意思是,如果我只删除对root的唯一活动引用,那么root必须得到GCed,因此,没有更多对root子项的活动引用,它们应该得到GCed。这必须作为连锁反应继续,直到整个树被GCed。我是对的还是我的分析有问题?

假设:所有节点仅由其父节点引用,没有其他节点引用。

1 个答案:

答案 0 :(得分:3)

一般来说,你是对的。 可以发生。

然而,从某种意义上说,大多数垃圾收集者都不会那样工作。当您删除树的根的最后一个链接时,GC不会立即启动。相反,它等待直到它是一个好的(例如有效的)运行时间。然后它会跟踪所有仍然可以访问的对象(即非垃圾),处理它们,然后回收其余的对象。 (事实上​​,对于最好的垃圾收集者来说,回收其余的过程非常便宜。)

对此的例外是引用计数(所谓的)垃圾收集器,其中删除最后一个引用确实可以触发立即级联的删除。但是引用计数不用于主流垃圾收集语言,因为它很慢并且因为它无法回收带有周期的数据结构。当然,没有Java实现我曾经遇到过用于垃圾收集的引用计数。