来自Effective Java 中的异常章节:
将代码放在 try-catch 块中会抑制现代 JVM 实现可能执行的某些优化
为什么以及如何使用 try-catch 块阻止 JVM 进行优化?
来自Effective Java 中的异常章节:
将代码放在 try-catch 块中会抑制现代 JVM 实现可能执行的某些优化
为什么以及如何使用 try-catch 块阻止 JVM 进行优化?
JVM 可能不会将 try/catch 块内的操作与 try/catch 块外的操作组合或重新排序。每一层的复杂性都使优化变得更加困难。如果这是一个相对罕见的情况,它可能不会由 JVM 处理,如果有疑问,它会选择正确性而不是最佳代码。
“为什么”的原因之一是假定异常和异常处理是异常的;即很少执行的代码。因此,JIT 编译器花在优化异常处理程序上的时间对整体性能几乎没有好处。
JIT 编译器的优化器必须平衡优化的性能优势和优化成本。后者包括:
也可能存在抑制异常处理程序优化的技术原因。例如,优化器可能不容易(甚至不可能)弄清楚控制流“来自”哪里。因此,无法执行基于知道的优化(例如,在寄存器中缓存内容、提升公共子表达式……)。