Mik*_*ike 10 java spring spring-data-jpa spring-bean
我一直在遇到问题,确保我正在销毁的Spring应用程序上下文已经完全消失,并且无法看到该对象被垃圾收集.当我查看VisualVM中的实例时,我可以看到对上下文和它的bean工厂有很多未完成的引用,一旦上下文被关闭和销毁就会保留.这些都与bean工厂的初始设置有关(在AbstractApplicationContext的刷新方法期间),它使用各种bean后处理器等注册bean工厂和上下文.
bean工厂或应用程序上下文(甚至是可刷新的)上似乎没有任何方法可以删除对bean工厂的最低级别引用.结果是它似乎泄漏了内存,并且在某些情况下阻止了上下文的干净重新创建.
我问,因为我正在处理的软件可能会动态创建/销毁然后重新创建上下文(因为模块是动态加载和卸载的),并且上下文和bean工厂的剩余元素导致组件出现问题as spring-data-jpa(特别是将存储库接口绑定到存储库实现的代理).
有没有人知道一种方法,我可以干净地完全删除上下文和bean工厂,而不必完全关闭最初创建它的VM?
小智 0
如果您在非Web应用程序环境中使用Spring的IoC容器;例如,在富客户端桌面环境中;您向 JVM 注册了一个关闭钩子。这样做可以确保正常关闭并在单例 bean 上调用相关的销毁方法,以便释放所有资源。当然,您仍然必须正确配置和实现这些销毁回调。
要注册关闭钩子,您应该调用在类registerShutdownHook()上声明的方法AbstractApplicationContext:
代码
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public final class startup {
public static void main(final String[] args) throws Exception {
AbstractApplicationContext ctx
= new ClassPathXmlApplicationContext(new String []{"beans.xml"});
// add a shutdown hook for the above context...
ctx.registerShutdownHook();
// app runs here...
// main method exits, hook is called prior to the app shutting down...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4853 次 |
| 最近记录: |