Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java循环引用和垃圾收集 我们考虑以下2个循环引用实例:_Java_Performance_Garbage Collection_Cyclic Reference - Fatal编程技术网

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中所示的习惯用法

Java
Reference
类型有几个性能含义:

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

  • 垃圾收集器比普通引用的工作量要大得多

  • 我还相信,它们会导致对象的收集延迟一个或多个GC周期…这取决于GC实现

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

相比之下,在第一个示例中使用普通循环引用时,没有性能或空间开销

总之,您的弱引用习惯用法降低了性能并增加了程序复杂性……但我看不到任何明显的好处



我的猜测是,这个问题源于一个错误的概念,即循环引用比Java中的非循环引用更昂贵……或者它们在某种程度上是有问题的(还有什么逻辑原因会导致人们提出这样的“习惯用法”)事实上,情况并非如此。java垃圾收集器不受引用计数的问题;例如C++“智能指针”。循环引用正确地处理(即不泄漏内存),并且有效地在java中。

问题是,您不知道GC何时清除弱引用对象。

它可能会在您声明时被清除!GC非常渴望收集它

或者,您可以对weakreference对象进行根引用,以防止其进行垃圾收集

或者通过RegisteredQueue检查其状态

这类似于finalize方法。您不知道GC何时执行此方法

资料来源:


我不会让代码变得更复杂或使用更多的概念,而不是说“为什么不?”问问自己“我需要这样做有什么好的理由吗?”@PeterLawrey这正是我的问题:“有什么好的理由吗…”我的目的是了解我是否遗漏了有关周期、弱引用和GCs的内容。我当然不打算盲目地在所有情况下使用示例2。我想知道是否存在更可取的情况,或者是否不存在任何情况……在最后一句话中,你的意思大概是“最终”,而不是“最终”。