我在初始上下文加载期间实例化bean时发现了一个奇怪的弹簧行为。我有一个装载大型ML模型的豆子。由于内存不足,bean无法实例化抛出java OutOfMemoryError
java堆空间异常。
但这并不会阻止应用程序实例化,而是继续加载应用程序。
为什么会这样?这是预期的吗?
检查了春天AbstractAutowireCapableBeanFactory
,
try {
// Mark this bean as currently in creation, even if just partially.
beforeSingletonCreation(beanName);
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
instance = resolveBeforeInstantiation(beanName, mbd);
if (instance == null) {
bw = createBeanInstance(beanName, mbd, null);
instance = bw.getWrappedInstance();
}
}
finally {
// Finished partial creation of this bean.
afterSingletonCreation(beanName);
}
使用评论// Finished partial creation of this bean.
这是否会影响应用程序的稳定性?为什么设计如此?
或者我错过了什么?
答案 0 :(得分:1)
请注意,这里没有catch语句!此外,OutOfMemoryError
不是Exception
,因此它不会被标准普通catch (Exception e)
捕获。
使用此finally
子句,Throwable
未被捕获。它必须在其他地方被捕获(消化)。
为什么Spring会继续工作?它基于Web服务器,而不是独立的专用应用程序,为什么它应该立即停止工作?并非所有异常都是关键的,即使错误有时(......很少)也会从中恢复。程序员有责任确保所有“他的”掷骰子得到妥善处理,而不是Spring's。