jmap - Memory Map

Generalmente cuando tenemos problemas, empezamos a buscar herramientas poco comunes para encontrar la causa o causas raices de la situación (actitud reactiva). En fin, el problema que se nos presentó en su momento fue en una aplicación que autentica Vs un directorio Novell, utilizando el standar LDAP. Sin embargo, la librería que se utiliza para esta actividad, es propietaria de la aplicación y contiene un bug que en cada cierto número de petición genera threads nuevos para atenderlas y cuando la petición fue concluída, el thread permanece con estado ALIVE y espera hasta una recolección de basura (FGC) para ser eliminado. "WRONG", es un leak en el heap de java pues se desperdicia una cantidad considerable de memoria y tiempo de ejecución del GC, cuando hablamos de instancias de Java de 32G.

En la siguiente gráfica (Cacti) muestra el comportamiento de los Threads vs FGC:

La solución fue hacer un switch del módulo LDAP a OpenLDAP que sorprendentemente no presentaba el problema.

Para llegar a la situación descrita, aislamos un servidor integrante del cluster y se realizaron dos actividades: heap y thread Dumps. En un post anterior mencioné como realizar el Thread Dump y en este caso realizaremos un Heap Dump con la herramienta jMap de Oracle que como objetivo tiene imprimir los mapas de la memoria de objetos compartidos o detalles de la memoria Heap de acuerdo a un proceso en específico o core file y hasta hacer debug en un servidor remoto.

 

En particular mostraré como realizar un dump del heap de java para enviar el contenido a un archivo binario, para un posterior análisis. El comando básico funciona de la siguiente manera:

 

AdjuntoTamaño
threads.png50.54 KB