根据 JLS,int
数组应该在初始化后立即用零填充。然而,我面临的情况并非如此。这种行为首先出现在 JDK7u4中,在以后的所有更新中也会出现(我使用的是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 上 Java 版本从1.7.0 _ 04到1.7.0 _ 10。此错误总是可以与上面的代码一起重现。我没有在32位 JDK 或 Windows 上测试这个问题。我已经向 Oracle 发送了一个 bug 报告(bug id 7196857) ,几天后它将出现在公共 Oracle bug 数据库中。
更新:
Oracle 在他们的公共 bug 数据库 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857中发布了这个 bug