在java中删除整个BST

在java中删除整个BST,java,data-structures,garbage-collection,binary-search-tree,Java,Data Structures,Garbage Collection,Binary Search Tree,我正在查看BSTs在Java中的实现,当需要删除整个树时(例如使用clear()函数),它会递归地遍历整个树,将节点引用分配给null。我想知道,如果只将树的根引用设置为null,垃圾收集器是否能够收集分配给树的所有内存,因为在根设置为null之后,不会有任何对节点的活动引用?如果这样做有效,是否需要多次运行垃圾收集器来收集整个树?一旦没有对树的任何节点的引用,垃圾收集器将能够回收整个树的内存。如果不存在对根节点的引用,但对子节点的可访问的引用仍然存在,则无法从内存中删除树 想象一下垃圾收集器是

我正在查看BSTs在Java中的实现,当需要删除整个树时(例如使用
clear()
函数),它会递归地遍历整个树,将节点引用分配给
null
。我想知道,如果只将树的根引用设置为null,垃圾收集器是否能够收集分配给树的所有内存,因为在根设置为null之后,不会有任何对节点的活动引用?如果这样做有效,是否需要多次运行垃圾收集器来收集整个树?

一旦没有对树的任何节点的引用,垃圾收集器将能够回收整个树的内存。如果不存在对根节点的引用,但对子节点的可访问的引用仍然存在,则无法从内存中删除树

想象一下垃圾收集器是如何工作的。它从不同的根(静态、全局、作用域变量等)构建所有可访问内存的图表。任何仍可访问的内存都无法回收。如果单个节点仍然可以访问,那么从该节点访问的任何内容也无法回收(BST节点的大多数实现都有父节点的访问器)

我想知道,如果只将树的根引用设置为null,而不将每个节点引用设置为null,那么java中的垃圾收集器是否能够收集分配给树的所有内存,因为在根设置为null之后,不会有任何对节点的活动引用

对。当删除对节点网络的最后一个活动外部引用时,所有节点都有资格进行垃圾收集。这听起来像你所描述的

如果它能够收集树的内存,那么需要多次运行垃圾收集器才能遍历树的每个级别吗

在简单的情况下,垃圾收集器可以一次将它们全部删除。在任何使用标记(而不是引用计数)的垃圾收集器中,垃圾收集器不需要遍历垃圾对象网络。相反,它遍历并标记非垃圾对象,并将未标记的对象视为垃圾


实际上,复杂的垃圾收集器将堆划分为多个空间(例如新一代和一个或多个旧一代),并且可以(至少)独立地对其中的一些进行垃圾收集。若树的节点已迁移到较旧的生成空间,那个么可能需要一个以上的GC“周期”才能将它们全部删除。然而,你对此无能为力。。。不管怎样,你都不应该在意它。

只要你不保留任何其他引用,删除树的根引用就足够了……而且这可能是关于循环引用的100多个问题的近似重复(尽管你的情况更简单),比如这个:或者这个:)