Selon le JLS, un inttableau doit être rempli de zéros juste après l'initialisation. Cependant, je suis confronté à une situation où ce n'est pas le cas. Un tel comportement se produit en premier dans JDK 7u4 et se produit également dans toutes les mises à jour ultérieures (j'utilise une implémentation 64 bits). Le code suivant lève une exception:
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'exception se produit après que la JVM a effectué la compilation du bloc de code et ne se produit pas avec l' -Xintindicateur. En outre, l' Arrays.fill(...)instruction (comme toutes les autres instructions de ce code) est nécessaire et l'exception ne se produit pas si elle est absente. Il est clair que ce bogue éventuel est lié à une certaine optimisation JVM. Des idées pour la raison d'un tel comportement?
Mise à jour:
Je vois ce comportement sur la VM serveur HotSpot 64 bits, la version Java de 1.7.0_04 à 1.7.0_10 sur Gentoo Linux, Debian Linux (les deux versions du noyau 3.0) et MacOS Lion. Cette erreur peut toujours être reproduite avec le code ci-dessus. Je n'ai pas testé ce problème avec un JDK 32 bits ou sous Windows. J'ai déjà envoyé un rapport de bogue à Oracle (id de bogue 7196857) et il apparaîtra dans la base de données publique de bogues d'Oracle dans quelques jours.
Mise à jour:
Oracle a publié ce bogue dans sa base de données publique de bogues: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857