java循环引用和垃圾收集

Yan*_*eve 3 java performance garbage-collection cyclic-reference

让我们考虑以下2个循环引用示例:

直接循环参考

class A {        
    B b;        
}

class B {
    A a;
}
Run Code Online (Sandbox Code Playgroud)

WeakReferenceing

class A {
    B b;
}

class B {
    WeakReference<A> aRef;
}
Run Code Online (Sandbox Code Playgroud)

@Jon Skeet回答的以下SO问题清楚地表明,只要没有来自已知根的"GC行走"存在于循环中,直接的示例也将被垃圾收集.

我的问题如下:

是否有任何理由表现或以其他方式使用或不使用示例2中表示的习语 - 使用WeakReference的习语?

Ste*_*n C 7

是否有任何理由表现或以其他方式使用或不使用示例2中表示的习语

Java Reference类型有几个性能影响:

  • 它们比常规引用使用更多空间.

  • 与普通引用相比,它们对垃圾收集器的工作要多得多.

  • 我还认为它们会导致对象的收集延迟一个或多个GC循环......取决于GC的实现.

此外,应用程序必须处理WeakReference可能被破坏的可能性

相比之下,在第一个示例中使用它们时,常规循环引用没有性能或空间开销.

总而言之,您的弱参考习语会降低性能并增加程序复杂性......没有任何实际的好处,我可以看到.


我的猜测是,这个问题源于错误的观念,即循环引用比Java中的非循环引用更昂贵......或者它们在某种程度上存在问题.(还有什么其他合乎逻辑的理由会导致人们提出像这样的"成语"?)事实上,事实并非如此.Java垃圾收集器不会受到引用计数的影响; 例如C++"智能指针".在Java中正确处理循环引用(即没有泄漏内存).