如果我在Java中有一棵树,并且我将根设置为NULL,那么所有节点都会被垃圾收集吗?

时间:2014-09-25 16:18:53

标签: java garbage-collection

Java中的大多数树删除操作都是将每个子节点设置为NULL,因此每个节点都是垃圾收集的。不应该简单地将root设置为NULL吗?

1 个答案:

答案 0 :(得分:4)

好吧,任何活动线程都无法访问的任何对象都有资格进行垃圾回收,即使你有一个巨大的对象图形仍然相互引用(如树)但是无法通过它们到达任何线程。

也就是说,将子引用设置为null将不会对资格做任何事情,因为如果没有对根的引用但仍然存在对节点的引用,那么至少该节点不能是gc' d。

根据树的设置方式,将每个节点引用设置为null可能允许收集大部分树,即使节点仍保留在其他位置(不一定在 代码中)

示例:

考虑一个链接列表(退化树),如下所示:

your code -> root <-> node1 <-> node2 <-> node3 <- some other code

如果您在代码中将root的引用设置为null,则仍无法收集列表,因为其他一些引用node3的代码依次引用其他节点root

但是,如果您同时删除节点之间的引用,则可以收集rootnode1node2,而node3则不能。
(在这种情况下,将代码中的引用移除到rootnode3node2就足够了,但是一般代码不知道哪个其他代码可能仍会引用节点,因此删除所有树内部引用是安全的方法。)