Java 中的循环引用
2022-08-31 20:53:33
给定以复杂、循环的方式相互引用的类实例的聚合:垃圾回收器是否有可能无法释放这些对象?
我依稀记得这是过去JVM中的一个问题,但我认为这在几年前就解决了。然而,在jhat的一些调查显示,循环引用是我现在面临的记忆泄漏的原因。
注意:我一直认为JVM能够解析循环引用并从内存中释放这种“垃圾孤岛”。但是,我提出这个问题只是为了看看是否有人发现任何例外。
给定以复杂、循环的方式相互引用的类实例的聚合:垃圾回收器是否有可能无法释放这些对象?
我依稀记得这是过去JVM中的一个问题,但我认为这在几年前就解决了。然而,在jhat的一些调查显示,循环引用是我现在面临的记忆泄漏的原因。
注意:我一直认为JVM能够解析循环引用并从内存中释放这种“垃圾孤岛”。但是,我提出这个问题只是为了看看是否有人发现任何例外。
只有非常幼稚的实现才会有循环引用的问题。维基百科上有一篇关于不同GC算法的好文章。如果您真的想了解更多信息,请尝试 (亚马逊) 垃圾回收:自动动态内存管理算法 。Java从1.2开始就有一个很好的垃圾收集器,在1.5和Java 6中也有一个非常好的垃圾收集器。
改进GC的困难部分是减少暂停和开销,而不是像循环引用这样的基本事情。
垃圾回收器知道根对象的位置:静态,堆栈上的局部变量等,如果对象无法从根访问,那么它们将被回收。如果他们是可以到达的,那么他们需要留下来。