Analizar problemas de memoria
Aprenda a identificar la causa de los problemas de memoria de la aplicación Java. Puede generar un volcado de la pila automática y manualmente, así como un histograma de la pila para identificar la causa.
Descripción description
Entorno
Experience Manager
Problema/Síntomas
La aplicación JAVA se ejecuta más lentamente y finalmente se queda sin memoria o muestra un error en los registros o en la salida de la consola OutOfMemoryError: Java heap space
o OutOfMemoryError: gc overhead limit exceeded
.
Resolución resolution
Causa
Estos problemas pueden tener muchas causas.
Una posible causa es que la aplicación java, en nuestro caso, CRX / CQ se haya iniciado desde la línea de comandos con la configuración de memoria de pila predeterminada de Java. Esto significa que no se ha especificado -Xmx
el parámetro jvm. CRX o CQ necesitan al menos 256 MB de memoria asignados para funcionar. Si este es el problema, asegúrese de que los ajustes de memoria estén configurados, empezando por la línea de comandos. Ejemplo:
java -Xmx512m -jar *.jar
Si este no es el caso, su aplicación podría estar reteniendo demasiados objetos sin liberarlos para recopilación de datos desechables. Esto se llama una fuga de memoria. Haga clic aquí para más información. Consulte la sección siguiente sobre cómo analizar los problemas de memoria en las aplicaciones java.
Crear volcado de la pila:
Generar un volcado de la pila automáticamente
Para crear automáticamente un volcado de la pila cuando se agote la memoria, puede agregar el parámetro jvm -XX:+HeapDumpOnOutOfMemoryError
para generar un volcado de la pila automáticamente cuando la aplicación lance un OutOfMemoryError. Por ejemplo,
java -Xmx256m -XX:+HeapDumpOnOutOfMemoryError -jar *.jar
Esto genera un archivo de volcado de la pila (java_...hprof
) en el directorio de trabajo del proceso cada vez que el proceso java se queda sin memoria. El proceso puede seguir ejecutándose después de que se haya generado el volcado. Normalmente, un archivo de volcado es suficiente para analizar el problema.
Nota: si está usando un script crx-quickstart/server/start
para iniciar su instancia de CRX, entonces puede añadir -XX:+HeapDumpOnOutOfMemoryError
a la variable CQ_JVM_OPTS
(asegúrese de que la variable también esté descomentada). Por ejemplo:
CQ_JVM_OPTS='-XX:+HeapDumpOnOutOfMemoryError'
Después de añadir este parámetro y de reiniciar la instancia CRX, verifique si la nueva opción jvm está establecida. Ejecute ps -ef | grep java
desde la línea de comandos. A continuación, compruebe si ve -XX:+HeapDumpOnOutOfMemoryError
como parámetro del proceso java de CRX.
Si necesita especificar un directorio diferente en el que generar el volcado de la pila debido a restricciones de espacio en el disco, puede añadir el parámetro -XX:HeapDumpPath=/path/to/generate/heapdump
para indicarle a jvm dónde colocar el archivo.
Vea aquí para obtener una referencia de los parámetros jvm relacionados con la depuración.
Generar un volcado de la pila manualmente
Sun/Oracle JVM
Para generar manualmente un volcado de la pila, ejecute este comando (jmap y jps se encuentran en la carpeta bin
de su directorio principal de jdk):
-
busque el pid del proceso java para el que está generando un volcado de la pila.
- En Unix o Linux esto se puede hacer con
ps -ef | grep java
ojps -l
- En Windows, esto se puede hacer abriendo el administrador de tareas, presione
Ctrl+Shift+Esc
, vaya a Ver, luego vaya a Seleccionar columnas y luego vaya a PID (Identificador de proceso) ojps -l
- En Unix o Linux esto se puede hacer con
-
Ejecute el comando jmap que aparece a continuación, sustituya
/path/to/generate/heapdumpfile.hprof
por la ubicación en la que desee generar el archivo de volcado de la pila, y sustituya1234
por el pid que buscó en el paso anterior.code language-none jmap -dump:format=b,file=/path/to/generate/heapdumpfile.hprof 1234
IBM JVM
Primero tendrá que cambiar la configuración por defecto de JVM con respecto a los agentes de volcado para generar los volcados correctos a señal de usuario. Hay varios tipos de volcados, pero generalmente se necesita el volcado completo del sistema para realizar un análisis exhaustivo de la memoria. Añada los siguientes argumentos:
Xdump:heap:opts=PHD+CLASSIC:events=user -Xdump:system:events=user
Este evento "usuario" que ocurre cuando JVM recibe la señal SIGQUIT (Linux, AIX®, z/OS®, e i5/OS™) o SIGBREAK (Windows) del sistema operativo.
Para obtener más información, consulte la documentación del fabricante aquí.
Advertencia: Los archivos de volcado de la pila son grandes y pueden tener el mismo tamaño en el disco que la configuración del parámetro jvm -Xmx de la pila máxima. Asegúrese de que tiene suficiente espacio en disco asignado al directorio donde se genera el archivo de volcado.
Analizar volcado de la pila
Una buena herramienta para analizar los volcados es EclipseMAT (Analizador de memoria Eclipse).
Esta herramienta no puede analizar los volcados generados por IBM JVM. Existen varias posibilidades para ello. IBM HeapAnalyzer funcionará bien con los volcados de la pila en formato PHD o clásico.
Para obtener un análisis completo del volcado del sistema, use el Área de trabajo del Asistente de soporte de IBM, con Herramientas de diagnóstico y supervisión de IBM para Java - Analizador de memoria instalado en la parte superior. El histograma de la pila es una medida sencilla del número de objetos activos y de la memoria utilizada por la clase Java. Desafortunadamente, según la instalación de Java, las herramientas necesarias pueden no estar disponibles o no funcionar siempre. Para crear un histograma de la pila, primero necesita el ID de proceso del proceso de Java. Para obtenerlo, ejecute ps or (if available), run:
Histograma del montón
El histograma de la pila es una medida sencilla del número de objetos activos y de la memoria utilizada por la clase Java. Desafortunadamente, según la instalación de Java, las herramientas necesarias pueden no estar disponibles o no funcionar siempre. Para crear un histograma de la pila, primero necesita el ID de proceso del proceso de Java. Para obtenerlo, ejecute ps
o (si está disponible):
jps -l
Esta herramienta Java obtiene los ID de proceso de todos los procesos Java en ejecución. Ejemplo:
327
3332 sun.tools.jps.Jps
3313 crx-quickstart-....jar
Ahora ejecute el siguiente comando:
jmap -histo 3313
La lista está ordenada por la memoria total requerida (poco profunda: excluyendo los objetos referenciados). Las primeras 20 líneas de la salida son las más interesantes. Ejemplo de salida:
JVM version is 1.5.0_20-141
Iterating over heap. This may take a while...
Warning: skipping invalid TLAB for thread t@62211
Warning: skipping invalid TLAB for thread t@62467
...
SizeCountClass description
-------------------------------------------------------
1059290412916byte`[` `]`
1028584075255* ConstMethodKlass
628317658388char`[` `]`
604230414928int`[` `]`
4995752116201* SymbolKlass
422089675255* MethodKlass
41965126969* ConstantPoolKlass
29285606969* InstanceKlassKlass
26310086066* ConstantPoolCacheKlass
2395872149742org.apache.jackrabbit.core.query.lucene.DocId$PlainDocId
14760087003java.util.HashMap$Entry`[` `]`
139612858172java.lang.String
107023244593java.util.HashMap$Entry
75398410036short`[` `]`
73546454org.apache.jackrabbit.core.query.lucene.DocId`[` `]`
7201927502java.lang.Class
64070413348com.day.crx.persistence.tar.index.IndexEntry
...
Más información
Para ayudar a analizar el problema, también necesitamos conocer la siguiente información:
- Versión de CRX o CQ, así como un listado de los números de versión de todas las revisiones instaladas.
- Sistema operativo, proveedor de JVM y versión.
Referencias
[
1]
Guía de solución de problemas del Centro de ayuda de Oracle >
para la máquina virtual HotSpot[
2]
Oracle.com >
javas >
DebuggingOptions