当前位置:  开发笔记 > 编程语言 > 正文

Java中的循环引用

如何解决《Java中的循环引用》经验,为你挑选了3个好方法。

给定一个以复杂,循环,方式相互引用的类实例的聚合:垃圾收集器是否可能无法释放这些对象?

我模糊地回忆起这在过去的JVM中是一个问题,但我认为这在几年前已得到解决.然而,在jhat的一些调查显示,循环引用是我现在面临的内存泄漏的原因.

注意:我一直认为JVM能够解析循环引用并从内存中释放这些"垃圾岛".但是,我提出这个问题只是为了看看是否有人发现任何例外情况.



1> David G..:

只有非常天真的实现才会出现循环引用的问题.维基百科有一篇关于不同GC算法的好文章.如果您真的想了解更多信息,请尝试(亚马逊)垃圾收集:自动动态内存管理算法.自1.2以来,Java有一个很好的垃圾收集器,在1.5和Java 6中有一个非常好的垃圾收集器.

改进GC的难点在于减少暂停和开销,而不是像循环引用这样的基本内容.



2> Rob Walker..:

垃圾收集器知道根对象的位置:静态,堆栈上的本地等,如果无法从根访问对象,则它们将被回收.如果他们可以到达,那么他们需要坚持下去.



3> Alexander..:

Ryan,根据您对Java中的循环引用的评论判断,您陷入了引用类中的对象的陷阱,该类可能由引导程序/系统类加载器加载.每个类都由加载类的类加载器引用,因此只有在类加载器不再可访问时才能进行垃圾收集.问题是bootstrap/system类加载器从不被垃圾收集,因此,从系统类加载器加载的类可以访问的对象也不能被垃圾收集.

JLS解释了这种行为的原因.例如,第三版12.7 http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.7.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有