Selon le JLS, un int
tableau 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' -Xint
indicateur. 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