【问题标题】:Does Hotspot JVM perform redundancy elimination of casts, unboxing and divisions?Hotspot JVM 是否执行强制类型转换、拆箱和除法的冗余消除?
【发布时间】:2014-12-05 02:17:00
【问题描述】:

例如,在这种情况下

int x;
for (...) {
    ... some work, y and z not changed
    x = y / z;
    ... some code using x
}

如果 JVM(实际上是 JIT 编译器)不能证明 z 是非零,在“正确”时刻抛出ArithmeticException

关于强制转换(可能导致ClassCastException)和拆箱(可能导致NullPointerException)的相同问题,仍然假设在某些情况下JVM / JIT编译器无法证明对象具有适当的类或拆箱值是非空。

更新。 morgano 说这个问题专门针对JVM实现。在这种情况下,我的问题是关于 Hotspot JVM/JIT 编译器的实现。

【问题讨论】:

标签: java jvm compiler-optimization jit jvm-hotspot


【解决方案1】:

是的,HotSpot JVM 一般可以做到这一点。

C2 JIT 编译器的关键特性之一是推测优化。这意味着 JIT 可以在不抛出运行时异常的假设下进行编译。在这种情况下,它可以轻松应用 Common Subexpression EliminationLoop Invariant Hoisting 和其他相关优化。

如果某个推测性假设碰巧失败,JIT 会取消优化该方法并继续以解释模式执行,以便在正确的位置抛出运行时异常。

顺便说一句,我检查了生成的程序集,HotSpot 在您的示例中确实只计算了一次 x = y / z

【讨论】:

  • 谢谢。优化/反优化点很简单,但没有引起我的注意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多