通过“发布”,我的意思是没有对类加载器的引用.
我们遇到了一个问题,即频繁重新部署的Java EE应用程序会占用permgen空间.分析表明,Java EE应用程序中的单例已经传递了对应用程序之外的应用程序类加载器对象的引用(违反Java EE规则),并且在取消部署应用程序时不会清除它们.
假设单例或类对象没有其他引用,那么在释放类的类加载器时是否会调用单例的finalize()?我想在那里清除流氓入境参考.或者我是在catch-22中,在类加载器本身可以被垃圾收集之前不会调用finalize – 因此由于流氓外部引用而永远不会被调用?
这里的主要问题可能是:
在这种情况下,类对象是否会被垃圾收集?这可能取决于类加载器行为的规范,或者可能依赖于实现.
参考文献(另一种!;-))将不胜感激,但不是必需的.
最佳答案
如果类加载器符合GCing条件并且没有其他引用,则只有对其进行静态引用的类才有资格进行垃圾回收.
原文链接:https://www.f2er.com/java/438029.htmlA 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