“已发布”是指没有对剩余类加载器的引用。
我们遇到了一个问题,经常重新部署的 Java EE 应用程序会占用 permgen 空间。分析表明,Java EE 应用程序中的单例已经传递了对应用程序外部应用程序类加载器对象的引用(违反了 Java EE 规则),并且在取消部署应用程序时没有清除它们。
假设没有其他对单例或类对象的引用,当其类的类加载器被释放时,单例的 finalize() 是否会被调用? 我想清除那里的流氓入站引用。或者我是否在一个 catch-22 中,直到类加载器本身可以被垃圾收集之前,finalize 才会被调用——因此永远不会因为流氓外部引用而被调用?
这里的主要问题可能是:
在这种情况下,类对象的类加载器还不能被垃圾收集吗? 这可能取决于类加载器行为的规范,或者可能取决于实现。
参考(另一种!;-))将不胜感激,但不是必需的。