如果我在Java中有一个树,并且我将根设置为NULL,那么所有节点都会被垃圾收集吗?

如果我在Java中有一个树,并且我将根设置为NULL,那么所有节点都会被垃圾收集吗?,java,garbage-collection,Java,Garbage Collection,Java中的大多数树删除操作都是将每个子节点设置为NULL,以便对每个节点进行垃圾收集。难道不应该简单地将root设置为NULL工作吗 好吧,任何活动线程都无法访问的对象都有资格进行垃圾收集,即使您有一个巨大的对象图,这些对象仍然相互引用(如树),但任何线程都无法访问 这就是说,将子引用设置为null对资格没有任何作用,因为如果没有对根的引用,但仍然存在对节点的引用,则至少该节点不能被gc识别 根据树的设置方式,将每个节点引用设置为null可能会允许收集树的很大一部分,即使节点仍保留在其他位置(

Java中的大多数树删除操作都是将每个子节点设置为NULL,以便对每个节点进行垃圾收集。难道不应该简单地将root设置为NULL工作吗

好吧,任何活动线程都无法访问的对象都有资格进行垃圾收集,即使您有一个巨大的对象图,这些对象仍然相互引用(如树),但任何线程都无法访问

这就是说,将子引用设置为null对资格没有任何作用,因为如果没有对根的引用,但仍然存在对节点的引用,则至少该节点不能被gc识别

根据树的设置方式,将每个节点引用设置为null可能会允许收集树的很大一部分,即使节点仍保留在其他位置(不一定在代码中)

例如:

考虑这样一个链表(退化树):

your code -> root <-> node1 <-> node2 <-> node3 <- some other code

您的代码->根节点1节点2节点3将所有子指针设置为NULL,这会占用大量CPU时间,并且可能会用无用的项目填满CPU缓存。我从未见过有人在C#中这样做,所以在“java世界”中一定有某种东西会长期保留notes。或者“根”通常是在非常旧的GC代中,但最近一代中的大多数节点都是一个重要的基准。@IanRingrose,在Java世界中,您不会太担心CPU缓存。此外,在通用树中,可能有大量与节点关联的数据,因此允许垃圾收集器释放这些数据在内存方面会有所帮助。和往常一样,这是一种速度-内存权衡。