[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Problemas con ui:repeat en la Java VM server



Continuando con el mail de ayer, explico brevemente un efecto
secundario que hemos encontrado en nuestra aplicaciÃn web al
pasar a usar la JVM server en lugar de la JVM client.

El problema consistÃa en que bucles basados en el tag de Facelets
<ui:repeat/> despuÃs de cierto tiempo de ejecuciÃn (en principio
indeterminado), dejaban de iterar correctamente y sÃlo mostraban el
primer elemento de la colecciÃn. Una vez se producÃa este error,
persistÃa hasta que se reiniciaba el servidor de aplicaciones, afectando
a todas las sesiones de usuario, aunque el "backing bean" que contenÃa
la propiedad iterada pertenecÃa al Ãmbito de la peticiÃn.

En principio, no podÃamos relacionar el cambio del recolector de basura
o los ajustes del heap con el tag de Facelets, pero tras un poco
de rastreo, encontramos la explicaciÃn en un bug de la JVM que se
produce sÃlo con la opciÃn -server [1] y que consiste en un error al
comparar con Integer.MAX_VALUE. 

Por lo visto (no lo he llegado a comprobar), el siguiente cÃdigo acaba
ejecutando la sentencia System.out.println despuÃs de 14.668
iteraciones:

public class HotSpotError {
    static public void main(String[] args) {
        int i1 = 0;
        int i2 = Integer.MAX_VALUE;

        while (i1 >= 0) {
            i1++;
            if (i1 > i2) {
                System.out.println("E R R O R: " + i1);
                return;
            }
        }
    }
}

Me ha sorprendido que este bug documentado en 2004 para J2SE 1.4 aÃn
se produzca en la J2SE 1.6.0_07.

Afortunadamente para nosotros, los desarrolladores de Facelets han
"rodeado" este problema a partir de la versiÃn 1.1.13 con el siguiente
parche para <ui:repeat/>:

         int i = this.getOffset();
         int end = this.getSize();
-        end = (end >= 0) ? i + end : Integer.MAX_VALUE;
+
+        // BUG #213: The Hotspot compiler has a bug that makes
         comparing
+        // against Integer.MAX_VALUE fail.  To get around this, default
+        // end to MAX_VALUE-1 if the size isn't specified.
+        // See:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6196102
+        end = (end >= 0) ? i + end : Integer.MAX_VALUE-1;


[1] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6196102

Un saludo,
Rafa

-- 
Rafael Luque Leiva

Osoco - http://www.osoco.es
Creando software para las personas

Edificio Moma Lofts
Planta 3, Loft 18
Ctra. MÃstoles-Villaviciosa, Km 0,2
MÃstoles, E28935 Madrid
Tel: +34 692 613 639
Fax: +34 916 091 075

GnuPG Key ID: 0x4B9238A2


Este mensaje puede contener informaciÃn confidencial y/o privilegiada.
Si usted no es la persona a la que va dirigido este mensaje y/o no estÃ
autorizado a leerlo, usted no puede usar, copiar, difundir o tomar
alguna acciÃn basada en el contenido incluido. Si usted ha recibido
este mensaje por error, por favor avise inmediatamente al remitente y
borre este mensaje. Gracias por su colaboraciÃn.

This message may contain confidential and/or privileged information. If
you are not the addressee or authorized to receive, you must not use,
copy, disclose or take any action based on this message or any
information herein. If you have received this message in error, please
advise the sender by reply e-mail and delete the message. Thank you for
your cooperation.