java循环引用和垃圾收集 我们考虑以下2个循环引用实例:
直接循环引用java循环引用和垃圾收集 我们考虑以下2个循环引用实例:,java,performance,garbage-collection,cyclic-reference,Java,Performance,Garbage Collection,Cyclic Reference,直接循环引用 class A { B b; } class B { A a; } class A { B b; } class B { WeakReference<A> aRef; } A类{ B B; } B类{ 由回答的WeakReference清楚地表明,只要从已知根到循环不存在“GC遍历”,那么直接的示例也将被垃圾收集 我的问题如下: 是否有任何理由使用或不使用示例2中所示的惯用语(使用WeakRefe
class A {
B b;
}
class B {
A a;
}
class A {
B b;
}
class B {
WeakReference<A> aRef;
}
A类{
B B;
}
B类{
由回答的WeakReference清楚地表明,只要从已知根到循环不存在“GC遍历”,那么直接的示例也将被垃圾收集
我的问题如下:
是否有任何理由使用或不使用示例2中所示的惯用语(使用WeakReference的惯用语)
是否有任何理由使用或不使用示例2中所示的习惯用法
JavaReference
类型有几个性能含义:
- 它们比常规引用使用更多的空间
- 垃圾收集器比普通引用的工作量要大得多
- 我还相信,它们会导致对象的收集延迟一个或多个GC周期…这取决于GC实现
此外,应用程序还必须处理WeakReference
可能被破坏的可能性
相比之下,在第一个示例中使用普通循环引用时,没有性能或空间开销
总之,您的弱引用习惯用法降低了性能并增加了程序复杂性……但我看不到任何明显的好处
我的猜测是,这个问题源于一个错误的概念,即循环引用比Java中的非循环引用更昂贵……或者它们在某种程度上是有问题的(还有什么逻辑原因会导致人们提出这样的“习惯用法”)事实上,情况并非如此。java垃圾收集器不受引用计数的问题;例如C++“智能指针”。循环引用正确地处理(即不泄漏内存),并且有效地在java中。 问题是,您不知道GC何时清除弱引用对象。
它可能会在您声明时被清除!GC非常渴望收集它
或者,您可以对weakreference对象进行根引用,以防止其进行垃圾收集
或者通过RegisteredQueue检查其状态
这类似于finalize方法。您不知道GC何时执行此方法
资料来源:
我不会让代码变得更复杂或使用更多的概念,而不是说“为什么不?”问问自己“我需要这样做有什么好的理由吗?”@PeterLawrey这正是我的问题:“有什么好的理由吗…”我的目的是了解我是否遗漏了有关周期、弱引用和GCs的内容。我当然不打算盲目地在所有情况下使用示例2。我想知道是否存在更可取的情况,或者是否不存在任何情况……在最后一句话中,你的意思大概是“最终”,而不是“最终”。