java循环引用和垃圾收集的性能
我们考虑以下2个循环引用实例:
直接循环引用
class A {
B b;
}
class B {
A a;
}
class A {
B b;
}
class B {
WeakReference<A> aRef;
}
下面由@Jon Skeet回答的SO question清楚地表明,只要从已知根到循环不存在“GC遍历”,那么直接的示例也将被垃圾收集
我的问题如下:
是否有任何理由使用或不使用示例2中所示的习语,即使用WeakReference的习语
# 1 楼答案
问题是你不知道GC什么时候会清除weakreference对象
它可能会被清除,就像你申报的那样!GC非常渴望收集它
或者,您可以对weakreference对象进行根引用,以防止它被垃圾回收
或者通过RegisteredQueue检查其状态
这就像最终确定方法一样。你不知道GC什么时候会执行这个方法
资料来源:
http://pawlan.com/monica/articles/refobjs/ http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html
# 2 楼答案
Java
Reference
类型有几个性能影响:它们比常规引用使用更多的空间
对于垃圾收集器来说,它们比普通引用的工作量要大得多
我还认为它们会导致对象的收集延迟一个或多个GC周期。。。取决于GC实现
此外,应用程序必须处理
WeakReference
可能被破坏的可能性相比之下,在第一个示例中使用普通循环引用时,没有性能或空间开销
总之,弱引用习惯用法会降低性能并增加程序复杂性。。。我看不到任何实质性的好处
我的猜测是,这个问题源于错误的概念,即在Java中循环引用比非循环引用更昂贵。。。或者他们有问题。(还有什么其他逻辑原因会导致人们提出这样的“习语”事实并非如此。Java垃圾收集器不存在引用计数问题;例如C++“智能指针”。循环引用在Java中得到了正确、高效的处理(即没有内存泄漏)