Yan*_*eve 3 java performance garbage-collection cyclic-reference
让我们考虑以下2个循环引用示例:
直接循环参考
class A {
B b;
}
class B {
A a;
}
Run Code Online (Sandbox Code Playgroud)
class A {
B b;
}
class B {
WeakReference<A> aRef;
}
Run Code Online (Sandbox Code Playgroud)
@Jon Skeet回答的以下SO问题清楚地表明,只要没有来自已知根的"GC行走"存在于循环中,直接的示例也将被垃圾收集.
我的问题如下:
是否有任何理由表现或以其他方式使用或不使用示例2中表示的习语 - 使用WeakReference的习语?
是否有任何理由表现或以其他方式使用或不使用示例2中表示的习语
Java Reference类型有几个性能影响:
它们比常规引用使用更多空间.
与普通引用相比,它们对垃圾收集器的工作要多得多.
我还认为它们会导致对象的收集延迟一个或多个GC循环......取决于GC的实现.
此外,应用程序必须处理WeakReference可能被破坏的可能性
相比之下,在第一个示例中使用它们时,常规循环引用没有性能或空间开销.
总而言之,您的弱参考习语会降低性能并增加程序复杂性......没有任何实际的好处,我可以看到.
我的猜测是,这个问题源于错误的观念,即循环引用比Java中的非循环引用更昂贵......或者它们在某种程度上存在问题.(还有什么其他合乎逻辑的理由会导致人们提出像这样的"成语"?)事实上,事实并非如此.Java垃圾收集器不会受到引用计数的影响; 例如C++"智能指针".在Java中正确处理循环引用(即没有泄漏内存).