通过“发布”,我的意思是没有对类加载器的引用.
我们遇到了一个问题,即频繁重新部署的Java EE应用程序会占用permgen空间.分析表明,Java EE应用程序中的单例已经传递了对应用程序之外的应用程序类加载器对象的引用(违反Java EE规则),并且在取消部署应用程序时不会清除它们.
假设单例或类对象没有其他引用,那么在释放类的类加载器时是否会调用单例的finalize()?我想在那里清除流氓入境参考.或者我是在catch-22中,在类加载器本身可以被垃圾收集之前不会调用finalize – 因此由于流氓外部引用而永远不会被调用?
这里的主要问题可能是:
在这种情况下,类对象是否会被垃圾收集?这可能取决于类加载器行为的规范,或者可能依赖于实现.
参考文献(另一种!;-))将不胜感激,但不是必需的.
A class or interface may be unloaded if and only if its defining class loader may be reclaimed by the garbage collector.
http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.7
此外,每个类都有对其类加载器的引用.因此,只要引用了由类加载的类或来自不可收集对象的类的对象,类加载器就不符合GCing的条件.
在对象符合垃圾收集条件并且在实际GC发生之前运行终结器一段时间.
在终结器中释放传入引用的方法(阻止GCing)不起作用.只要存在此类引用,就不会调用终结器,因为它们会阻止对象符合垃圾回收的条件.例如,你不能从内部破坏这个参考链:
singleton instance <--- singleton class <--- class loader <--
<-- any class loaded by that class loader <-- any object of such a class
<-- object loaded by another classloader referencing such an object or class
原文地址:https://www.jb51.cc/java/438029.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。