为什么下面的代码在Java 1.6和1.7中表现不同

时间:2016-07-25 23:04:09

标签: java

以下代码

public class Test16Jit {
  public static void main(String[] s) {
      int max = Integer.MAX_VALUE;
      int i = 0;
      long li = 0;
      while (i >= 0) {
          i++;
          li++;
          if (i > max) {
              System.out.println("i is : " + i);
              System.out.println("max is : " + max);
              System.out.println("Woo!! something really went wrong");
          }
      }
      System.out.println("Value of i: " + i);
      System.out.println("Total # of iterations: " + li);      
  }
}

java 1.7x中的输出

Value of i: -2147483648
Total # of iterations: 2147483648

以下Java 1.6x中的输出

i is : 2147483636
max is : 2147483647
Woo!! something really went wrong
Value of i: -2147483648
Total # of iterations: 2147483648

这种行为有原因吗?

如果我改变

int max = Integer.MAX_VALUE; -> final int max = Integer.MAX_VALUE;

在1.6x和1.7x

中表现完全相同

1 个答案:

答案 0 :(得分:7)

这似乎是由JIT编译引起的与此相关的一系列错误中的一个例子(我选择了这个由于代码的相似性,随意探索其他人 - 他们非常有趣!):

http://bugs.java.com/view_bug.do?bug_id=6196102

  

评价

     

问题在于准备环路退出测试的规范化   循环转换。

     

do while (++i <= limit)

     

变为

     

do while (++i < limit+1)

     

当限制为maxInt时,这是不正确的。

1.7中修复了一些问题,这可以解释您的结果。