有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java循环引用和垃圾收集的性能

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

直接循环引用

class A {        
    B b;        
}

class B {
    A a;
}

WeakReferenceing

class A {
    B b;
}

class B {
    WeakReference<A> aRef;
}

下面由@Jon Skeet回答的SO question清楚地表明,只要从已知根到循环不存在“GC遍历”,那么直接的示例也将被垃圾收集

我的问题如下:

是否有任何理由使用或不使用示例2中所示的习语,即使用WeakReference的习语


共 (2) 个答案

  1. # 2 楼答案

    Is there any reason performance or otherwise to use or not to use the idiom represented in example 2

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

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

    • 对于垃圾收集器来说,它们比普通引用的工作量要大得多

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

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

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

    总之,弱引用习惯用法会降低性能并增加程序复杂性。。。我看不到任何实质性的好处


    我的猜测是,这个问题源于错误的概念,即在Java中循环引用比非循环引用更昂贵。。。或者他们有问题。(还有什么其他逻辑原因会导致人们提出这样的“习语”事实并非如此。Java垃圾收集器不存在引用计数问题;例如C++“智能指针”。循环引用在Java中得到了正确、高效的处理(即没有内存泄漏)