3

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

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

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

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

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

4

2 回答 2

4

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

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

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

有关的:

在 Java 中将对象分配给 null 会影响垃圾收集吗?

可以从类本身中取消一个类吗?

真的有必要在 JUnit 拆解方法中取消对象吗?

于 2013-04-18T08:24:33.230 回答
1

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

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

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

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

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

于 2013-04-18T08:43:22.923 回答