我一直遇到一些问题,以确保我正在销毁的 spring 应用程序上下文已完全消失,并且看不到被垃圾收集的对象。当我查看 VisualVM 中的实例时,我可以看到有许多对上下文和它的 bean 工厂的未完成引用,一旦上下文关闭和销毁就会保留下来。这些都与 bean 工厂的初始设置有关(在 AbstractApplicationContext 的刷新方法期间),它向各种 bean 后处理器等注册 bean 工厂和上下文。
在 bean 工厂或应用程序上下文(甚至是可刷新的上下文)上似乎没有任何方法除了删除对 bean 工厂的最低级别引用之外。结果是它似乎正在泄漏内存,并且在某些情况下会阻止干净地重新创建上下文。
我问的是因为我目前正在使用的软件可能会动态创建/销毁然后重新创建上下文(因为模块是动态加载和卸载的)并且上下文和 bean 工厂的剩余元素会导致问题使用 spring-data-jpa 等组件(尤其是将存储库接口(interface)绑定(bind)到存储库实现的代理)。
有谁知道我可以干净、完全地删除上下文和 bean 工厂而不必完全关闭最初创建它的 VM 的方法吗?
最佳答案
最近再次研究这个问题,我注意到我正在覆盖上下文的 doClose()
方法以确保 bean 被完全销毁,但没有调用 super.doClose ()
方法,这意味着 LiveBeansView.unregisterApplicationContext()
/destroyBeans()
/getLifecycleProcessor().onClose()
和closeBeanFactory()
未被调用。
我添加了这个,并且(大多数)如果不是所有上下文现在都被干净地销毁并被垃圾收集。我假设任何未被破坏的未完成上下文更可能是我们自己的代码中存在悬垂引用的问题。
关于java - 彻底销毁 Spring Application Context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40384145/