当Java树结构不再需要时,我需要手动释放吗?

3

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

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

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

这对我来说总是有意义的,因为仅仅将你在某个地方存储的树根引用设置为 null 是不够的 - 子节点可能仍然具有对它的引用,这意味着它将继续存在于内存中并导致内存泄漏。我是否正确地假设了这一点并提供了这样的方法?
我怀疑自己的原因是,在提供树形结构支持的 API 中很少看到这样的方法(至少在树节点接口中不直接提供)。处理这种情况的适当模式是什么?

如果您遇到内存问题,这可能会有所帮助,特别是因为父节点和子节点之间存在双向引用。 - Marco Forberg
Java不鼓励你销毁和释放对象,这就是为什么它有垃圾回收机制的原因。 - Ariel Pinchover
2个回答

4

我注意到在实施后内存消耗发生了变化。它至少可以被视为某种优化吗? - predi
我不这么认为,你可能会错过其他东西,比如CPU。只要没有紧急的内存需求,GC算法可能会更频繁地清理易于清理的对象。 - Ahmad Y. Saleh
有许多信息可供查阅 :) 可以尝试谷歌搜索“java can nullifying object help GC”。我已经在帖子中更新了链接。 - Vitaly

1
我最近考虑了这个问题,并得出结论,答案大多数情况下是否定的。
如果您使用节点持有对数据的引用来构建正常的Tree类型结构,则唯一可以暴露该结构(从而防止其被丢弃)的方法是分发节点。如果这样做,那么当然,您的树的大部分都可能被另一个组件引用。
大多数情况下,您将分发不具备任何对树中其他节点的引用的数据。
但是,如果错误地设计数据结构以公开树的内部结构,则可能会遇到问题。例如,如果您设计Map.Entry类以保存对树结构组件(如条目所在的节点)的引用,则会出现问题。
请记住,垃圾回收过程的作用是将所有内容视为不可达,除非它是可达的。仅因为您拥有复杂的交织结构并不意味着它很难丢弃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接