Java循环引用,糟糕的风格?

Java循环引用,糟糕的风格?,java,memory-management,reference,garbage-collection,Java,Memory Management,Reference,Garbage Collection,我正在研究一个树形结构,其中事件必须能够向下传播到根元素。同时,我使用visitor模式来序列化这棵树。访问者被提供了根的引用,并沿着树向上移动 因此,我需要使用某种循环引用(对于事件,孩子需要了解其家长;对于访客,家长需要了解所有孩子) 类树节点{ 列出儿童名单; 树状体亲本; ... } 我现在想把这些循环引用分解。释放根节点时,应自动释放树的其余部分 我一直在试验parent字段的弱引用。我得到了空指针异常,因为java释放了父字段,该字段随后被事件访问 如何解决这个问题?Java垃圾收

我正在研究一个树形结构,其中事件必须能够向下传播到根元素。同时,我使用visitor模式来序列化这棵树。访问者被提供了根的引用,并沿着树向上移动

因此,我需要使用某种循环引用(对于事件,孩子需要了解其家长;对于访客,家长需要了解所有孩子)

类树节点{
列出儿童名单;
树状体亲本;
...
}
我现在想把这些循环引用分解。释放根节点时,应自动释放树的其余部分

我一直在试验
parent
字段的弱引用。我得到了空指针异常,因为java释放了父字段,该字段随后被事件访问


如何解决这个问题?

Java垃圾收集足够聪明,不会被循环引用愚弄。一旦没有对树的强引用,那么包含循环引用的整个树都将被垃圾收集

您需要做的就是确保没有从树外部到树内部任何地方的引用


如果某个事件正在访问父字段,则表明某个事件仍然具有引用。您需要清理它(无论是否删除循环引用)。

Java垃圾收集足够聪明,不会被循环引用愚弄。一旦没有对树的强引用,那么包含循环引用的整个树都将被垃圾收集

您需要做的就是确保没有从树外部到树内部任何地方的引用


如果某个事件正在访问父字段,则表明某个事件仍然具有引用。您将需要清理它(无论是否删除循环引用)。

您确定您确实有问题吗?如果没有人持有对树的任何元素的引用,Java将乐于循环collect。你的数据结构意味着任何树型都会使整个树停留在内存中,但是为什么你会认为这是个问题?按照惯例,只有叶和根是从外部引用的。到目前为止,我基本上没有遇到任何内存问题。我只是不知道java能够清理那些不断引用自己的“内存岛”,你确定你真的有问题吗?如果没有人持有对树的任何元素的引用,Java将乐于循环collect。你的数据结构意味着任何树型都会使整个树停留在内存中,但是为什么你会认为这是个问题?按照惯例,只有叶和根是从外部引用的。到目前为止,我基本上没有遇到任何内存问题。我只是不知道java能够清理那些不断引用自己的“内存岛”。
class TreeNode {
    List<TreeNode> children;
    TreeNode parent;
    ...
}