Hotspot JVM是否执行强制转换、取消装箱和划分的冗余消除



例如,在这种情况下,

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

JVM(实际上是JIT编译器)是否允许在for循环之前计算x = y / z一次,如果不能证明z是非零的,是否允许在"正确"的时刻抛出ArithmeticException

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

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

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

C2 JIT编译器的一个关键特性是推测优化。这意味着JIT可以在假定不引发运行时异常的情况下进行编译。在这种情况下,它可以很容易地应用公共子表达式消除循环不变提升和其他相关优化。

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

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

最新更新