我有一个对 Spring 的 ApplicationContext 有静态引用的类。当类即将被卸载时,我需要清除该上下文并运行其单例 bean 的 destroy 方法。那么,在卸载类时是否会调用一些类级终结器回调,以便我可以清除该回调中的上下文?
我对使用 WeakReferenceQueue 和计数器来跟踪该类的未引用对象有一个模糊的想法,这样我就可以检测到该类何时没有活动对象,但这仍然不会告诉我何时卸载该类本身。
我有一个对 Spring 的 ApplicationContext 有静态引用的类。当类即将被卸载时,我需要清除该上下文并运行其单例 bean 的 destroy 方法。那么,在卸载类时是否会调用一些类级终结器回调,以便我可以清除该回调中的上下文?
我对使用 WeakReferenceQueue 和计数器来跟踪该类的未引用对象有一个模糊的想法,这样我就可以检测到该类何时没有活动对象,但这仍然不会告诉我何时卸载该类本身。
“卸载一个类”的方法是让所有类都无法访问以及加载它们的 ClassLoader。请参阅在 java 中卸载类?有关此过程的完整说明。
类是与 Java 中的任何其他对象一样的对象。所以对 finalizer() 的经典调用也是为类实现的。此方法由垃圾收集器调用,而不是您明确调用。
没有其他标准方法可以在 Java 中卸载类或对象。如果没有其他对象引用包含 dispose() 的对象(称为“RefCount”),您可以通过实现一个方法(例如“dispose()”)可以自己执行一些操作。
要知道对象的当前引用计数或真正强制垃圾收集,您必须使用JVM Tool Interface。
您也可以尝试调用System.runFinalization()
,但 JVM 不保证将调用所有终结器。
那么,在卸载类时是否会调用一些类级别的终结器回调。
我查看了明显的地方,据我所知,没有这样的回调。除了破解JVM本身之外,我想不出一种方法来实现它。