Laut JLS sollte ein int
Array unmittelbar nach der Initialisierung mit Nullen gefüllt werden. Ich bin jedoch mit einer Situation konfrontiert, in der dies nicht der Fall ist. Ein solches Verhalten tritt zuerst in JDK 7u4 und auch in allen späteren Updates auf (ich verwende die 64-Bit-Implementierung). Der folgende Code löst eine Ausnahme aus:
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);
}
Die Ausnahme tritt auf, nachdem die JVM die Kompilierung des Codeblocks durchgeführt hat, und tritt nicht mit dem -Xint
Flag auf. Darüber hinaus ist die Arrays.fill(...)
Anweisung (wie alle anderen Anweisungen in diesem Code) erforderlich, und die Ausnahme tritt nicht auf, wenn sie nicht vorhanden ist. Es ist klar, dass dieser mögliche Fehler mit einigen JVM-Optimierungen verbunden ist. Irgendwelche Ideen wegen eines solchen Verhaltens?
Update:
Ich sehe dieses Verhalten auf HotSpot 64-Bit-Server-VM, Java-Version von 1.7.0_04 bis 1.7.0_10 unter Gentoo Linux, Debian Linux (beide Kernel 3.0-Version) und MacOS Lion. Dieser Fehler kann immer mit dem obigen Code reproduziert werden. Ich habe dieses Problem nicht mit einem 32-Bit-JDK oder unter Windows getestet. Ich habe bereits einen Fehlerbericht an Oracle gesendet (Fehler-ID 7196857), der in wenigen Tagen in der öffentlichen Oracle-Fehlerdatenbank angezeigt wird.
Update:
Oracle hat diesen Fehler in seiner öffentlichen Fehlerdatenbank veröffentlicht: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857