variable tipos tipo referenciados referencia programacion objetos objeto datos java memory-management memory-leaks template-engine rythm

tipos - variables de referencia en java



RythmEngine y TemplateClassManager los objetos más grandes del montón: problemas de pérdida de memoria (1)

Nos hemos enfrentado y hemos encontrado ese problema, pero es debido a la compilación de plantillas una y otra vez. Para evitar esto, hicimos las siguientes configuraciones: Habilitar el modo prod Habilitar el almacenamiento en caché de plantillas. Establecer la ubicación del directorio compilado de la plantilla: para almacenar la versión compilada de los archivos de plantilla. (No confundas con la configuración del directorio de la plantilla) que aumentará la velocidad de tu aplicación.

Map<String, Object> rythmConfigs = new HashMap<>(); //rythmConfigs.put(ENGINE_MODE, this.appMode ? "prod" : "dev"); rythmConfigs.put(PRECOMPILE_MODE_ENABLED, this.config.getBoolean(PRECOMPILE_MODE_ENABLED, true)); rythmConfigs.put(LOAD_PRECOMPILED_ENABLED, this.config.getBoolean(LOAD_PRECOMPILED_ENABLED, true)); rythmConfigs.put("rythm.default.cache_ttl", Integer.MAX_VALUE); rythmConfigs.put("rythm.cache.enable", this.appMode); //rythmConfigs.put("cache.prod_only.enabled", this.appMode); rythmConfigs.put(PRECOMPILED_DIR, getTempDir(config.getString(XoAppConfigKeys.APPLICATION_CONTEXT)).getAbsolutePath()); rythmConfigs.put(TEMPLATE_DIR, this.templateFolderUri.getPath()); rythmEngine = new RythmEngine(rythmConfigs);

En mi compañía, estamos usando Rythm debido a su facilidad y uso fácil en un proyecto. En nuestro proyecto, estamos enviando varios correos electrónicos (1000-2000 correos electrónicos por día); la plantilla de correo electrónico es una plantilla de Rythm con sintaxis dinámica (código de Java). El rendimiento parece correcto y pasó las pruebas de integración.

Sin embargo, hemos experimentado varios problemas de memoria que conducen a una pérdida de memoria después de 3-4 días. El perfilado, hemos observado que Rythm es el objeto más grande del montón (nuestros perfiles son de aproximadamente 1 día) incluso más que el ClassLoader o el BeanFactory de Spring.

Usando el analizador de herramientas Heap, hemos observado que RythmEngine y TemplateClassManager son los objetos más grandes

(Instance) - (retained size bytes) org.rythmengine.RythmEngine#1 - 10,192,894 org.rythmengine.internal.compiler.TemplateClassManager#1 - 9,223,065 org.springframework.boot.loader.LaunchedURLClassLoader#1 - 6,975,661 java.util.Vector#89 - 6,378,290 java.lang.Object[]#7549 - 6,378,254 org.springframework.beans.factory.support.DefaultListableBeanFactory#1 - 3,741,643 ......

Podemos ver en las herramientas del analizador de pila que estos objetos son grandes, y parece que aumentan con el tiempo.

Y una raíz de GC

En cuanto a las agrupaciones de memoria: Par Eden parece estar bien y CMS Old Generation parece no aumentar, o al menos lentamente (incluso después de algunos GC principales parece que hay memoria libre). La memoria de pila parece estar bien (las pruebas y el perfilado son de aproximadamente un día), pero la producción aumenta lentamente después de alcanzar el montón máximo.

Estamos preguntando si alguien ha experimentado esta función (usando el ritmo y después de algunos días aparece una pérdida de memoria) o simplemente da algunas mejores prácticas sobre cómo mejorar el rendimiento a ritmo en un entorno de producción. O cualquier idea de cómo lidiar con una fuga de memoria de profundidad será bienvenida.

NOTA IMPORTANTE [30-09-2015]: Hemos cambiado de Rythm a FreeMarker como motor de plantillas y parece (como lo reflejan nuestros sistemas de supervisión) que la memoria es más estable y tiene aproximadamente el 20% de la memoria máxima (-Xmx1024). Informaremos más detalladamente durante esta semana. Pero parece que Rythm podría tener algunos problemas de memoria que conduce a una pérdida de memoria después de un par de días.

NOTA IMPORTANTE [06-10-2015]: Después de algunos días de monitoreo intensivo, hemos comprobado que la memoria es estable usando FreeMarker como motor de plantillas. Hemos eliminado todas las dependencias de Rythm en nuestro producto porque, como nuestros estudios lo reflejan , tiene un problema potencial de fuga de memoria no resuelto que conduce a un OOME por montón después de algunos días (en nuestro caso, dos días). Problema cerrado.