【问题标题】:Do I need to manually dispose of a java tree structure when it is no longer needed?当不再需要 java 树结构时,我是否需要手动处理它?
【发布时间】:2013-04-18 08:18:24
【问题描述】:

我在我的应用程序中构建了许多对象树,其中每个节点都是典型的树节点(对父节点的引用和对子节点的引用列表)。这些树是临时的,这意味着我可能会在应用程序终止之前将它们处理掉。

到目前为止,我一直在树节点类中添加一个方法,该方法能够递归地遍历树分支并“销毁它”(将父引用设置为 null 并清除子列表等)。

public void destroy() {
    for (Node node : children) {
        node.destroy();
    }
    parent = null;
    children.clear();
}

这对我来说总是有意义的,因为简单地将对您存储在某处的树根的引用设为空是不够的 - 孩子们可能仍然有对它的引用,这意味着它将留在内存中并导致内存泄漏。我假设这一点并提供这样的方法是否正确?

我怀疑自己的原因是我很少在提供树结构支持的 API 中看到这样的方法(至少不是直接在树节点接口中)。处理此类情况的正确模式是什么?

【问题讨论】:

  • 如果您有内存问题,这可能会有所帮助,因为您在父节点和子节点之间有双向引用
  • java 不鼓励你销毁和释放对象,这就是他们有 GC 的原因。

标签: java memory data-structures tree


【解决方案1】:

您不需要自己销毁或清理对象。

您只需要确保 live 对象没有对它们的引用(live 听起来很清楚,但这是相当复杂的定义)。

请注意,即使在不需要的对象中存在课程引用,您也不需要关心它们,GC 会处理这个问题。

相关:

Does assigning objects to null in Java impact garbage collection?

Can a class be nullified from within the class itself?

Is it really necessary to nullify objects in JUnit teardown methods?

【讨论】:

  • 我确实注意到实现它后内存消耗的变化。它至少可以作为某种优化通过吗?
  • 我不相信,你会缺少其他东西,比如 CPU。只要没有紧急的内存需求,GC 算法可能会更频繁地清理易于清理的对象。
  • 那里有很多信息 :) 尝试谷歌“java 可以使对象无效化帮助 GC”。我用链接更新了帖子。
【解决方案2】:

我最近考虑过这个问题,得出的结论是答案是否定的——大部分情况下。

如果您有一个普通的Tree 类型结构,使用Nodes 持有对data 的引用,那么您可以公开该结构(因此阻止其处置)的唯一方法是分发您的@987654324 @s。如果你这样做,那么你的树的大块当然可以被另一个组件引用。

大多数情况下,您将分发 data,它本身并没有对树中的其余节点有任何引用。

但是,您可能会错误地设计数据结构,从而暴露树的内部结构。例如,如果您设计 Map.Entry 类来保存对树结构组件(例如条目所在的节点)的引用,那么您将遇到问题。

请记住,垃圾收集过程所做的是将所有内容视为不可访问,除非它是可访问的。仅仅因为你有一个复杂的交织结构并不意味着它是复杂的丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2011-08-01
    • 2011-08-21
    • 2012-01-19
    相关资源
    最近更新 更多