public static void main(String[] args) {
int[] a;
int n = 0;
for (int i = 0; i < 100000000; ++i) {
a = new int[10];
for (int f : a)
if (f != 0)
throw new RuntimeException("Array just after allocation: "+ Arrays.toString(a));
Arrays.fill(a, 0);
for (int j = 0; j < a.length; ++j)
a[j] = (n - j)*i;
for (int f : a)
n += f;
}
System.out.println(n);
}
在JVM对代码块进行编译后,异常会发生,并且不会在使用-Xint
标志时出现。此外,Arrays.fill(...)
语句(以及代码中的其他语句)是必需的,如果没有它,异常就不会发生。很明显,这个可能的错误与某些JVM优化有关。对于这种行为的原因有什么想法吗?
更新:
我在HotSpot 64位服务器VM上,Java版本从1.7.0_04到1.7.0_10,在Gentoo Linux、Debian Linux(两者都是3.0版本的内核)和MacOS Lion上看到了这种行为。这个错误可以通过上面的代码始终重现。我没有在32位JDK或Windows上测试这个问题。我已经向Oracle发送了一个错误报告(错误ID 7196857),它将在几天内出现在公共的Oracle错误数据库中。
更新:
Oracle在他们的公共错误数据库中发布了这个错误:https://bugs.java.com/bugdatabase/view_bug?bug_id=7196857