我所说的“已发布”是指没有对剩余的类加载器的引用。
我们遇到了一个问题,即频繁重新部署的 Java EE 应用程序会占用 permgen 空间。分析表明,Java EE 应用程序中的单例已将引用传递给应用程序外部的应用程序类加载器对象(违反 Java EE 规则),并且在取消部署应用程序时不会清除它们。
假设没有其他对单例或类对象的引用,单例的 finalize() 会在其类的类加载器被释放时被调用吗? 我想清除流氓 in-那里有绑定(bind)引用。或者我是否处于 catch-22 中,在类加载器本身可以被垃圾收集之前不会调用 finalize - 因此永远不会因为流氓外部引用而被调用?
这里的主要问题可能是:
在这种类加载器还不能进行垃圾回收的情况下,类对象是否会被垃圾回收?这可能取决于类加载器行为的规范,或者可能取决于实现。 p>
引用文献(另一种!;-))将不胜感激,但不是必需的。
最佳答案
如果类加载器符合 GC 条件并且没有其他引用,则具有对其静态引用的类将仅符合垃圾回收条件。
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
关于java - 发布类加载器时,什么时候对单例调用 finalize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9489772/