首页 > 解决方案 > Web 应用程序是否将代码隐式包装在禁止 JVM 优化的 try-catch 块中?

问题描述

我们都知道 try-catch 块会抑制某些编译器优化,如下所述:

“将代码放在 try-catch 块中会抑制 JVM 实现以其他方式执行的某些优化。” 有效的 Java,第 69 条(约书亚·布洛赫)

即使从未抛出异常,使用 try-catch 块是否昂贵?

那么,Web 应用程序呢?在 Web 应用程序中,特别是在控制器中,一切都 - 在某种程度上 - 包含在 try-catch 块中。我们知道,因为在发生未处理的异常时,我们的应用程序不会崩溃,而是返回服务器错误 500。我们是否可以说在 Web 控制器中运行的任何代码都被隐式检查异常,其后果是我们提到的(禁止优化)?

更新。我试图缩小问题的范围,顺便说一句,这纯粹是理论上的。最初的假设是:JVM 不能对 try-catch 块内的代码应用某些优化。所以:

缺乏这些优化是否也适用于方法调用?

或者换句话说:

JVM 可以优化从 try-catch 块调用的方法中的代码吗?或者 try-catch 块是否会阻止对任何代码段的优化 - 甚至方法调用堆栈跟踪 - 在其中执行?

标签: javacompiler-optimization

解决方案


答案基本上是:是的,这些优化对于那些调用是不可能的,但是不,没关系。

每秒很少有网络请求。在调用上花费比没有 catch 块的调用多 1000% 的时间也没关系,因为该 try/catch 块每秒最多执行几千次。Try/catch 只会减慢通话速度,而不是通话中的通话,看到了吗?


推荐阅读