jsf - tipos - primefaces mvc
Consumo de memoria JSF 2.2: ¿Por qué Mojarra mantiene los beans ViewScoped de las últimas 25 vistas en la memoria? (0)
La memoria por sesión crece
Estamos experimentando un alto consumo de memoria usando JSF 2.2 (2.2.12) con Mojarra. Después de investigar nuestras pruebas de carga, resultó que el tamaño de los datos en nuestros beans ViewScoped es bastante alto (a veces más de 1 MB). De todos modos, cuando se navega de una vista a otra, el tamaño de la memoria de la sesión crece y crece. No podemos disminuir el tamaño de los granos a corto plazo, por lo que este comportamiento ha dejado de tener algún impacto.
Solución 1 - Cambio de parámetros de contexto (no funciona)
Ahora - jugamos con el parámetro de contexto oficial de Mojarra, que están configurados a 15 por defecto:
com.sun.faces.numberOfLogicalViews
com.sun.faces.numberOfViewsInSession
Cambiar esos parámetros a un valor más bajo no tuvo ningún impacto en el consumo de memoria en nuestras pruebas de carga.
Solución 2 - Cambiar activeViewMapsSize (funcionando)
Estábamos depurando Mojarra y encontramos el siguiente código en ViewScopeManager
:
Integer size = (Integer) sessionMap.get(ACTIVE_VIEW_MAPS_SIZE);
if (size == null) {
size = 25;
}
El tamaño predeterminado para mantener las últimas vistas visitadas parece ser 25. Al ver esto, implementamos un Listener de sesión que establece este valor en 1:
public class SetActiveViewMapsSizeSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
event.getSession().setAttribute(ViewScopeManager.ACTIVE_VIEW_MAPS_SIZE, 1);
}
}
Eso obviamente funcionó. La memoria dejó de crecer ya que solo se mantiene una vista.
Entonces, ¿por qué 25 vistas en la memoria?
Entonces, Mojarra mantiene un historial de 25 Vistas en Memoria si no se define un valor diferente en la Sesión. No puedo encontrar ninguna documentación sobre esto. ¿Alguien puede explicar para qué es esto? ¿Es para el navegador de nuevo? Tenemos el almacenamiento en caché desactivado en nuestras páginas JSF. Entonces, el navegador volverá a crear una nueva vista. Esto no debería ser un problema para nosotros.
¿Es la solución 2 un enfoque válido? ¿Podría alguien explicar los inconvenientes de este enfoque?
Actualización 1
Después de varios comentarios y una depuración más profunda, resultó que:
-
com.sun.faces.numberOfLogicalViews
define el tamaño de logicalViewMap, que almacena solo (!) el estado del árbol de componentes ui -
com.sun.faces.application.view.activeViewMapsSize
define el tamaño de activeViewMap, que contiene los beans ViewScoped
Al cambiar numberOfLogicalViews
a 1, mojarra seguirá realizando un seguimiento de todos los beans con vista de las últimas 25 vistas. Cuando lo configura al revés - numberOfLogicalViews
a 15 y activeViewMapsSize
a 1 - la vista no se puede inicializar correctamente debido a la falta de datos, supongo. Ni siquiera recibimos una excepción. Me gustaría entender por qué mojarra eligió establecer el activeViewMapsSize
más alto que el numberOfLogicalViews
y no el mismo, ya que queremos ajustar nuestro consumo de memoria sin obtener un comportamiento impredecible.
Actualización 2
Creamos un problema en Mojarra JAVASERVERFACES-4015