在try catch块中放置一些代码可以阻止JVM进行优化?

Gee*_*eek 5 java try-catch effective-java

从Effective Java中的Exceptions章节:

将代码放在try-catch块中会禁止现有JVM实现可能执行的某些优化

try-catch块为什么以及如何阻止JVM优化?

Pet*_*rey 5

JVM可能不会将try/catch块内的操作与try/catch块之外的操作组合或重新排序.每一层复杂性都会使优化更加困难.如果它是一个相对罕见的情况,它可能不会由JVM处理,如果有疑问,将选择正确而不是最佳代码.

  • 为什么它是一个复杂的情况,很少有用. (2认同)

Ste*_*n C 2

“为什么”的原因之一是异常和异常处理被假定为异常;即很少执行的代码。由此可见,JIT 编译器花在优化异常处理程序上的时间对整体性能几乎没有什么好处。

JIT 编译器的优化器必须平衡有效优化的性能优势与优化成本。后者包括:

  • 检查复杂先决条件以查看是否可以进行优化的成本,
  • 进行实际优化的成本,以及
  • 实施和维护一个复杂软件的成本(对 Oracle 来说),该软件进行的优化(在正常条件/假设下)不会有效。

还可能存在阻碍异常处理程序优化的技术原因。例如,优化器可能不容易(甚至不可能)弄清楚控制流“来自”哪里。因此,基于了解的优化(例如在寄存器中缓存内容、提升公共子表达式……)无法执行。