为什么我的JVM做了一些运行时循环优化并使我的代码有问题?

Dir*_*nry 10 java macos jvm runtime compiler-optimization

考虑以下java代码:

public int main() {
    int i = 1111;

    for (; rules(i) != true && i < Integer.MAX_VALUE; i++) {
        //LOG.debug("Testing i: " + i);
    }

    System.out.println("The mystery number is: " + i);

    return i;
}

protected boolean rules(int nb) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

我发现即使for循环延续评估是true,循环将在其主体为空时停止执行.

最终结果main是错误的(i16698约98%的时间,有时高一点/更低).

如果我从循环体中取消注释LOG语句,循环将继续运行,直到循环连续评估为止false.

我正在使用的JVM是MacOS X VM 1.6.0.

  • 它正在进行某种运行时优化吗?
  • 这个运行时优化是否可以被视为错误?
  • 或者它是否在Java规范的某处说过,继续评估不应该运行功能操作?

ps:完整的代码源+单元测试可在此处获取:https://gist.github.com/dirtyhenry/5804130

更新:

  • 我只通过junit运行代码.junit可以对这种行为负责吗?

更新2:

java -version
Run Code Online (Sandbox Code Playgroud)

收益:

java version "1.6.0_51"
Java(TM) SE Runtime Environment (build 1.6.0_51-b11-456-11M4508)
Java HotSpot(TM) 64-Bit Server VM (build 20.51-b01-456, mixed mode)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ley 2

我见过一些关于 SO 循环优化的参考资料,仅在超过 10000 次迭代后才会发生。也许这就是为什么“神奇数字”通常在 16000 左右的原因?

这里有一个很好的讨论

用于优化循环语句的 JVM 选项