我正在研究Java中BST的实现,当需要删除整个树时(例如使用clear()
函数),它递归地遍历整个树,将节点引用分配给{{1} }。我想知道如果只是将树的Root引用设置为null,垃圾收集器是否能够收集为树分配的所有内存,因为在Root设置为root之后将不会有任何对节点的实时引用空值?如果这样可行,是否需要多次垃圾收集器运行来收集整个树?
答案 0 :(得分:2)
我想知道java中的垃圾收集器是否能够收集为树分配的所有内存,如果只将树的Root引用设置为null而不将每个单个节点引用设置为null,因为不存在Root设置为null后对节点的任何活动引用?
是。当删除对节点网络的最后一个实时外部引用时,所有节点都符合条件以进行垃圾回收。这听起来就像你在描述的那样。
如果能够收集树的内存,是否需要多次垃圾收集器运行才能通过树的每个级别?
在简单的情况下,垃圾收集器可以一次性删除它们。在任何使用标记(而不是引用计数)的垃圾收集器中,垃圾收集器不需要遍历垃圾对象的网络。相反,它遍历并标记非垃圾对象,并处理它没有标记为垃圾的对象。
实际上,复杂的垃圾收集器将堆分成空间(例如新一代和一代或多代)并且可以独立地垃圾收集(至少)其中一些。如果您的树的节点已迁移到较旧的一代空间,那么它可能需要多个GC的“循环”才能将它们全部删除。但是,关于这个问题,你无能为力......无论如何你都不应该关心它。
答案 1 :(得分:0)
一旦没有对树的任何节点的引用,垃圾收集器将能够回收整个树的内存。如果根节点没有引用,但子节点仍然存在可访问引用,则无法从内存中删除该树。
想象一下垃圾收集器的工作原理。它构建了各种根(静态,全局,范围变量等)的所有可访问内存的图形。任何仍然可访问的内存都无法回收。如果仍然可以访问单个节点,则无法回收任何可从其访问的节点(BST节点的大多数实现都具有父节点的访问器)。