给定一个以复杂,循环,方式相互引用的类实例的聚合:垃圾收集器是否可能无法释放这些对象?
我模糊地回忆起这在过去的JVM中是一个问题,但我认为这在几年前已得到解决.然而,在jhat的一些调查显示,循环引用是我现在面临的内存泄漏的原因.
注意:我一直认为JVM能够解析循环引用并从内存中释放这些"垃圾岛".但是,我提出这个问题只是为了看看是否有人发现任何例外情况.
只有非常天真的实现才会出现循环引用的问题.维基百科有一篇关于不同GC算法的好文章.如果您真的想了解更多信息,请尝试(亚马逊)垃圾收集:自动动态内存管理算法.自1.2以来,Java有一个很好的垃圾收集器,在1.5和Java 6中有一个非常好的垃圾收集器.
改进GC的难点在于减少暂停和开销,而不是像循环引用这样的基本内容.
垃圾收集器知道根对象的位置:静态,堆栈上的本地等,如果无法从根访问对象,则它们将被回收.如果他们可以到达,那么他们需要坚持下去.
Ryan,根据您对Java中的循环引用的评论判断,您陷入了引用类中的对象的陷阱,该类可能由引导程序/系统类加载器加载.每个类都由加载类的类加载器引用,因此只有在类加载器不再可访问时才能进行垃圾收集.问题是bootstrap/system类加载器从不被垃圾收集,因此,从系统类加载器加载的类可以访问的对象也不能被垃圾收集.
JLS解释了这种行为的原因.例如,第三版12.7 http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.7.