2

我在初始上下文加载期间实例化 bean 时发现了一个奇怪的弹簧行为。我有一个加载大型 ML 模型的 bean。由于内存不足,bean 无法实例化抛出 java OutOfMemoryErrorjava heap space 异常。但这不会阻止应用程序实例化,而是继续加载应用程序。

为什么会这样?这是预期的吗?

检查弹簧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.

这不会影响应用程序的稳定性吗?为什么会这样设计?
还是我错过了什么?

4

1 回答 1

1

请注意,这里没有 catch 语句!而且,OutOfMemoryErroris 不是Exception,所以不会被标准的 general 抓到catch (Exception e)

有了这个finally子句,Throwable就不会被抓住。它必须在其他地方被捕获(消化)。

为什么 Spring 继续它的工作?它基于 Web 服务器,而不是独立的专用应用程序,为什么要立即停止工作?并非所有异常都是关键的,有时甚至可以(...很少)从中恢复错误。确保正确处理所有“他的”可抛出对象是程序员的职责,而不是 Spring 的。

于 2013-09-06T11:41:59.500 回答