Últimamente he estado investigando un proceso Java que fallaba por falta de memoria y he visto unas cuantas técnicas de monitorización bastante útiles.
Los parámetros para el control de memoria de la máquina virtual Java se pueden ajustar por línea de comandos. Hay muchos parámetros disponibles, pero cabe destacar -Xms y -Xmx. Podéis consultar las opciones más importantes en la documentación oficial.
Para tener un volcado de la heap en caso de error, son muy útiles las opciones -XX:+HeapDumpOnOutOfMemoryError y -XX:HeapDumpPath=/dir.
Una opción muy potente de monitorización es usar JMX y conectarse mediante la JConsole, de esta forma podemos cambiar bastantes parámetros en caliente, como muestro en la imagen inferior. Para habilitar JMX tenemos la opción -Dcom.sun.management.jmxremote.port=_portNum_ y también tendremos que crear un usuario y contraseña como se describe en la documentación.

Otra opción de monitorización es habilitar el acceso SNMP, de esta forma nos es muy fácil acceder mediante Nagios o Cacti y tener un registro de lo que ha ido pasando en nuestro proceso Java. Podemos activar SNMP pasando los siguientes parámetros: -Dcom.sun.management.snmp.port=161 -Dcom.sun.management.snmp.interface=0.0.0.0
A continuación copiaremos el archivo de MIBs http://java.sun.com/javase/6/docs/jre/api/management/JVM-MANAGEMENT-MIB.mib como /usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.txt. Además, para que funcione correctamente, tenemos que generar unas ACL y darle permisos de lectura solamente a root:
# cp /usr/lib/jvm/jre/lib/management/snmp.acl.template /usr/lib/jvm/jre/lib/management/snmp.acl # chmod 0600 /usr/lib/jvm/jre/lib/management/snmp.acl
Editamos el fichero /usr/lib/jvm/jre/lib/management/snmp.acl y ponemos algo parecido a esto (sustituir localhost por las IPs/redes que nos interesen):
acl = {
{
communities = public, private
access = read-only
managers = localhost
}
}
Para listar todos los parámetros que podemos consultar, podemos hacerlo con:
snmpwalk -m JVM-MANAGEMENT-MIB -v 2c -c public _ip_:_puerto_ .
Existen unas plantillas para cacti muy buenas en este post: http://forums.cacti.net/viewtopic.php?t=23490
Podéis sacar más información en:
http://www.ninthavenue.com.au/blog/monitoring-the-jvm-with-snmp http://www.latascadexela.es/2009/02/depurar-fugas-de-memoria-en-java-tomcat.html