
Tengo que crear volcados de montón, lo cual funciona bien con jmap. Mi problema es que jmap tarda mucho en crear el archivo heapdump. Especialmente cuando el montón se hace más grande (> 1 GB), está tardando demasiado.
Una situación como ejemplo:
cuando el servidor tiene problemas con el espacio de almacenamiento dinámico, quiero reiniciarlo automáticamente y crear un volcado de almacenamiento dinámico antes del reinicio. Esto funciona, pero lleva demasiado tiempo escribir el volcado de memoria. De esta manera el servidor estará inactivo por mucho tiempo. La creación del volcado de memoria lleva más de una hora.
Lo sé -XX:+HeapDumpOnOutOfMemoryError
, pero la mayoría de las veces puedo encontrar el problema de memoria antes de que la jvm lance la excepción.
¿Existe una alternativa a jmap que escriba los volcados de montón más rápido?
También se agradecería una solución especial para el ejemplo anterior.
Esta pregunta es una mezcla entre programación y administración de sistemas, pero creo que estoy en el lugar correcto.
Respuesta1
Encontré una respuesta a mi pregunta. esteLa respuesta a otra pregunta sobre serverfault me dio la idea.
- conéctese con gdb a su proceso java
gdb --pid=<your java pid>
- crear un volcado de núcleo desde gdb
gcore <file name>
detach
quit - reinicia el proceso java o haz lo que quieras
- crear un volcado de memoria dinámica a partir del volcado de núcleo, conectando jmap al volcado de núcleo
jmap -heap:format=b <path to java binary> <core dump file>
En el paso 4, es vital que especifique el binario de Java correcto; de lo contrario, jmap no podrá adjuntarse al volcado de memoria. Si no está seguro de qué binario se utilizó para el proceso de Java, abra el volcado de núcleo con gdb:
gdb --core=<core dump file>
Habrá una línea como esta que le indicará la ruta completa:
Core was generated by '/opt/tomcat/bin/jsvc'.
crear el volcado de memoria es mucho más rápido que crear el volcado de memoria directamente a través de jmap. De esta manera, puede crear un volcado de un proceso Java sin tiempos de inactividad demasiado prolongados.
EDITAR:
cuando recibe el siguiente mensaje de error, es posible que haya especificado el binario de Java incorrecto:
Error attaching to core file: Can't attach to the core file
Para obtener el binario de Java correcto para la llamada a jmap, abra el volcado de núcleo con gdb:
gdb --core=[path tp core file]
Habrá una línea como esta, indicándote el binario correcto:
Core was generated by `/opt/tomcat/bin/jsvc'.