2

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

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

假设:所有节点仅由其父节点引用,其他任何节点均未引用。

4

1 回答 1

3

一般来说,你是对的。那可能会发生。

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

对此的例外是引用计数(所谓的)垃圾收集器,其中删除最后一个引用确实会触发立即级联删除。但是在主流垃圾收集语言中没有使用引用计数,因为它很慢并且因为它不能使用循环回收数据结构。当然,我从来没有遇到过使用引用计数来进行垃圾收集的 Java 实现。

于 2012-09-20T03:28:39.863 回答