1

我有一个对 Spring 的 ApplicationContext 有静态引用的类。当类即将被卸载时,我需要清除该上下文并运行其单例 bean 的 destroy 方法。那么,在卸载类时是否会调用一些类级终结器回调,以便我可以清除该回调中的上下文?

我对使用 Wea​​kReferenceQueue 和计数器来跟踪该类的未引用对象有一个模糊的想法,这样我就可以检测到该类何时没有活动对象,但这仍然不会告诉我何时卸载该类本身。

4

2 回答 2

1

“卸载一个类”的方法是让所有类都无法访问以及加载它们的 ClassLoader。请参阅在 java 中卸载类?有关此过程的完整说明。

类是与 Java 中的任何其他对象一样的对象。所以对 finalizer() 的经典调用也是为类实现的。此方法由垃圾收集器调用,而不是您明确调用。

没有其他标准方法可以在 Java 中卸载类或对象。如果没有其他对象引用包含 dispose() 的对象(称为“RefCount”),您可以通过实现一个方法(例如“dispose()”)可以自己执行一些操作。

要知道对象的当前引用计数或真正强制垃圾收集,您必须使用JVM Tool Interface

您也可以尝试调用System.runFinalization(),但 JVM 不保证将调用所有终结器。

于 2012-08-15T04:43:38.080 回答
1

那么,在卸载类时是否会调用一些类级别的终结器回调。

我查看了明显的地方,据我所知,没有这样的回调。除了破解JVM本身之外,我想不出一种方法来实现它。

于 2012-08-15T06:11:00.070 回答