Secondo JLS, un int
array dovrebbe essere riempito di zeri subito dopo l'inizializzazione. Tuttavia, mi trovo di fronte a una situazione in cui non lo è. Tale comportamento si verifica prima in JDK 7u4 e si verifica anche in tutti gli aggiornamenti successivi (utilizzo l'implementazione a 64 bit). Il codice seguente genera un'eccezione:
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);
}
L'eccezione si verifica dopo che JVM ha eseguito la compilazione del blocco di codice e non si presenta con -Xint
flag. Inoltre, l' Arrays.fill(...)
istruzione (come tutte le altre istruzioni in questo codice) è necessaria e l'eccezione non si verifica se è assente. È chiaro che questo possibile bug è limitato da alcune ottimizzazioni JVM. Qualche idea sulla ragione di un simile comportamento?
Aggiornamento:
vedo questo comportamento sulla VM del server HotSpot 64-bit, versione Java da 1.7.0_04 a 1.7.0_10 su Gentoo Linux, Debian Linux (sia versione kernel 3.0) che MacOS Lion. Questo errore può sempre essere riprodotto con il codice sopra. Non ho provato questo problema con un JDK a 32 bit o su Windows. Ho già inviato una segnalazione di bug a Oracle (ID bug 7196857) e apparirà nel database di bug Oracle pubblico in pochi giorni.
Aggiornamento:
Oracle ha pubblicato questo bug nel proprio database pubblico di bug: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857