que objetos metodos imprimir ejemplos dinamico clase array java arrays jvm initialization java-7

objetos - metodos arraylist java



Java: int array se inicializa con elementos distintos de cero (2)

Aquí nos encontramos con un error en el compilador JIT. El compilador determina que la matriz asignada se completa después de la asignación en Arrays.fill(...) , pero la verificación de usos entre la asignación y el relleno es incorrecta. Entonces, el compilador realiza una optimización ilegal: omite la puesta a cero de la matriz asignada.

Este error se coloca en el rastreador de errores de Oracle ( http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857 ). Lamentablemente, no esperé ninguna aclaración de Oracle sobre los siguientes puntos. Como veo, este error es específico del sistema operativo: es absolutamente reproducible en Linux y Mac de 64 bits, pero, como veo por los comentarios, se reproduce no regularmente en Windows (para versiones similares de JDK). Además, sería bueno saber cuándo se solucionará este error.

Solo hay consejos por el momento: no use JDK1.7.0_04 o posterior si depende de JLS para matrices recién declaradas.

Actualización al 5 de octubre:

En el nuevo Build 10 del JDK 7u10 (acceso anticipado) lanzado el 4 de octubre de 2012, este error se corrigió al menos para el sistema operativo Linux (no probé otro). Gracias a @Makoto, quien descubrió que este error ya no está disponible para el acceso público en la base de datos de errores de Oracle. Lamentablemente, no sé por las razones por las que Oracle lo eliminó del acceso público, pero está disponible en la memoria caché de Google. Además, este error llamó la atención de Redhat: los identificadores de CVE-2012-4420 ( CVE-2012-4420 ) y CVE-2012-4416 ( CVE-2012-4416 ) se asignaron a este error.

De acuerdo con el JLS, una matriz int debe llenarse con ceros justo después de la inicialización. Sin embargo, me enfrento a una situación en la que no lo es. Tal comportamiento ocurre primero en JDK 7u4 y también ocurre en todas las actualizaciones posteriores (yo uso la implementación de 64 bits). El siguiente código arroja una excepción:

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); }

La excepción se produce después de que la JVM realiza la compilación del bloque de código y no -Xint con el indicador -Xint . Además, la Arrays.fill(...) (como todas las otras declaraciones en este código) es necesaria, y la excepción no ocurre si está ausente. Está claro que este posible error está limitado con cierta optimización de JVM. ¿Alguna idea sobre el motivo de tal comportamiento?

Actualizar:
Veo este comportamiento en la máquina virtual del servidor HotSpot de 64 bits, la versión de Java del 1.7.0_04 al 1.7.0_10 en Gentoo Linux, Debian Linux (versión kernel 3.0) y MacOS Lion. Este error siempre se puede reproducir con el código anterior. No probé este problema con un JDK de 32 bits o en Windows. Ya envié un informe de error al Oracle (ID de error 7196857) y aparecerá en la base de datos pública de errores de Oracle en pocos días.

Actualizar:
Oracle publicó este error en su base de datos pública de errores: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196857


Hice algunos cambios en tu código. No es un problema de desbordamiento de enteros. Ver el código, arroja una excepción en el tiempo de ejecución

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)); } } for (int ii = 0, len = a.length; ii < len; ii++) a[ii] = 0; for (int j = 0; j < a.length; ++j) a[j] = Integer.MAX_VALUE - 1; for (int j = 0; j < a.length; ++j) n++; }