Java中的大多数树删除操作都是将每个子节点设置为NULL,因此每个节点都是垃圾收集的。不应该简单地将root设置为NULL吗?
答案 0 :(得分:4)
好吧,任何活动线程都无法访问的任何对象都有资格进行垃圾回收,即使你有一个巨大的对象图形仍然相互引用(如树)但是无法通过它们到达任何线程。
也就是说,将子引用设置为null将不会对资格做任何事情,因为如果没有对根的引用但仍然存在对节点的引用,那么至少该节点不能是gc' d。
根据树的设置方式,将每个节点引用设置为null可能允许收集大部分树,即使节点仍保留在其他位置(不一定在 代码中)
示例:
考虑一个链接列表(退化树),如下所示:
your code -> root <-> node1 <-> node2 <-> node3 <- some other code
如果您在代码中将root
的引用设置为null,则仍无法收集列表,因为其他一些引用node3
的代码依次引用其他节点root
。
但是,如果您同时删除节点之间的引用,则可以收集root
,node1
和node2
,而node3
则不能。
(在这种情况下,将代码中的引用移除到root
和node3
到node2
就足够了,但是一般代码不知道哪个其他代码可能仍会引用节点,因此删除所有树内部引用是安全的方法。)