以下代码
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
中表现完全相同答案 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中修复了一些问题,这可以解释您的结果。