5

来自Effective Java 中的异常章节:

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

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

4

3 回答 3

5

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

于 2012-07-19T09:32:27.673 回答
2

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

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

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

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

于 2012-07-19T11:49:45.107 回答
-1

检查以下链接:

Java 异常有多慢?

我猜异常是 Java 对象,需要创建这些对象。创建对象是一项昂贵的操作。因此,仅将异常用于处理错误而不是控制流程。

于 2012-07-19T10:00:02.787 回答