我在我的应用程序中构建了许多对象树,其中每个节点都是典型的树节点(对父节点的引用和对子节点的引用列表)。这些树是临时的,这意味着我可以在应用程序终止之前处理它们。
到目前为止,我总是向树节点类添加一个方法,该方法能够递归遍历树分支并“销毁它”(将父引用设置为null并清除子列表等)。
public void destroy() {
for (Node node : children) {
node.destroy();
}
parent = null;
children.clear();
}
这对我来说总是有意义的,因为简单地将对存储在某个地方的树的根的引用置零是不够的 - 孩子们可能仍然会引用它,这意味着它将留在内存中并导致内存泄漏。我是否正确地假设并提供这样的方法?
我怀疑自己的原因是我很少在API中看到提供树结构支持的方法(至少不直接在树节点接口中)。处理此类案件的正确模式是什么?
答案 0 :(得分:4)
您不需要自己销毁或清理物品。
您只需要确保 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?
答案 1 :(得分:1)
我最近考虑了这个,并得出结论,答案是否定的 - 主要是。
如果你有一个正常的Tree
类型结构,使用Node
持有对data
的引用,那么你可以揭露结构的唯一方法(因此阻止它被处置)是分发你的Node
。如果你这样做,当然你的树的大块可以被另一个组件引用。
大多数情况下,您将分发data
,它本身没有任何对树中其余节点的引用。
但是,可能会错误地设计数据结构,因此您可以公开树的内部结构。例如,如果您将Map.Entry
类设计为保存对树结构组件的引用,例如条目所在的节点,那么您将遇到问题。
请记住,垃圾收集过程的作用是将所有视为无法访问,除非它可以访问。仅仅因为你有一个复杂的交织结构并不意味着它丢弃很复杂。