根据JLS,int
数组应在初始化后立即用零填充。但是,我面临的情况并非如此。这种行为首先在JDK 7u4中发生,并且在以后的所有更新中也发生(我使用64位实现)。以下代码引发异常:
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(在Gentoo Linux,Debian Linux(均为内核3.0版本)和MacOS Lion)上从1.7.0_04到1.7.0_10的Java版本上看到了此行为。始终可以使用上面的代码来重现此错误。我没有在32位JDK或Windows上测试此问题。我已经向Oracle发送了一个错误报告(错误ID 7196857),几天后它将出现在公共Oracle错误数据库中。
更新:
Oracle在其公共错误数据库中发布了此错误:http : //bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857