gpt4 book ai didi

java - Hotspot JVM 是否执行强制转换、拆箱和划分的冗余消除?

转载 作者:行者123 更新时间:2023-11-30 09:01:40 27 4
gpt4 key购买 nike

例如,在这种情况下

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

是否允许 JVM(实际上是 JIT 编译器)在 for 循环之前计算一次 x = y/z 和“一些工作”(可能有副作用或抛出不同的异常(exception)),如果它不能证明 z 是非零的,在“正确”的时刻抛出 ArithmeticException

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

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

最佳答案

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

C2 JIT 编译器的一个关键特性是推测优化。这意味着 JIT 可以在不抛出运行时异常的假设下进行编译。在这种情况下,它可以轻松应用通用子表达式消除循环不变提升和其他相关优化。

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

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

关于java - Hotspot JVM 是否执行强制转换、拆箱和划分的冗余消除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26290473/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com