java - 为什么我的 JVM 会进行一些运行时循环优化并使我的代码出现错误?

标签 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) {
    //...
}

我发现,即使 for 循环的继续评估为 true,循环体也会在循环体为空时停止执行。

main 的最终结果是错误的(i 大约 98% 的时间是 16698,有时略高/略低)。

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

我使用的 JVM 是 MacOS X VM 1.6.0。

  • 它是否在进行某种运行时优化
  • 这个运行时优化可以被认为是一个错误吗?
  • 或者在 Java 规范的某个地方说,持续评估不应运行功能操作?

ps: 完整的代码源+单元测试可以在这里找到:https://gist.github.com/dirtyhenry/5804130

更新:

  • 我只通过 junit 运行代码。 junit 是否应对此行为负责?

更新 2:

java -version

返回:

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)

最佳答案

我在这里遇到了类似的问题:Near empty Java For-Loop acts strange 您应该尝试使用 JVM 1.7 或尝试使用 while 循环:

public int main() {
    int i = 1111;

    while(i < Integer.MAX_VALUE){
        if (!rules(i)) {
            break;
        }
        i++
    }

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

    return i;
}

关于java - 为什么我的 JVM 会进行一些运行时循环优化并使我的代码出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17166047/

相关文章:

swift - 从 macOS 应用程序调用时使用 "key code"的 applescript 中的错误 1002

css - 如果 textarea 的父项都没有固定大小,为什么它不接受相对字体大小? (火狐 18.0 Mac)

ubuntu - Solr JVM 内存和 MMapDirectory

java - 如何通过负载测试优化 JVM & GC

eclipse - JVM 终止。退出代码 = -1

java - 类型不匹配 : cannot convert from Element to Elements & first cannot be resolved or is not a field

java - 如何在独立于环境的 META-INF 中打开文件

java - 双数组丢失信息

java - 添加新节点时,hazelcast 内存队列是否会扩展?

xcode - 如何从我的自定义框架中删除 header ?