【问题标题】:Deleting the whole BST in java在java中删除整个BST
【发布时间】:2012-01-14 00:57:51
【问题描述】:

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

【问题讨论】:

标签: java data-structures garbage-collection binary-search-tree


【解决方案1】:

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

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

如果它能够收集树的内存,是否需要多次垃圾收集器运行才能遍历树的每一层?

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

在实践中,复杂的垃圾收集器将堆划分为多个空间(例如,新一代和一个或多个旧代),并且可以独立地收集(至少)其中一些。如果您的树的节点已迁移到老一代空间,那么 可能需要不止一个 GC 的“周期”才能将它们全部删除。但是,您对此无能为力……而且您也不应该关心它。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 2021-05-24
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多