Troubleshooting de Memoria Java
Frecuentemente se piensa que en Java no debería haber problemas de memoria, porque existe un Garbage Collector (GC) que libera el espacio ocupado por los
objetos de la aplicación que ya no se encuentran referenciados,. Pero en ocasiones esto no es suficiente. Por este motivo es necesario entender cómo funciona la memoria en Java y cuáles son sus configuraciones, ya que no todo se hace de forma automática.
Garbage Collector
El Garbage Collector se activa cuando no hay suficiente memoria y ocurre un Allocation Failure (AF) o bien por un llamado utilizando System.gc() desde el programa (esto último no es aconsejable). GC trabaja en tres etapas: Mark, se marcan los objetos referenciados; Sweep, identifica los objetos no referenciados; y Compact, opcional pero muy costoso. La compactación busca remover todos los espacios entre los objetos y esto es complicado porque si un objeto es movido el GC debe cambiar todas las referencias que apuntan a él. La recolección de basura es llevada a cabo por el thread que hace el pedido de almacenamiento (Allocation) y se hace con un mecanismo llamado Stop_The_World (STW) que produce que todos los demás threads de la aplicación sean suspendidos mientras la recolección de basura es llevada a cabo.
Una buena práctica es siempre ejecutar la aplicación con la opción verboseGC habilitada en la JVM. El impacto es mínimo y la información provista respecto al uso de memoria de la JVM es invaluable al momento de ocurrir un problema. La siguiente información se puede obtener habilitando verboseGC:
- Uso total de memoria en cada ciclo GC.
- ¿Tarda mucho la recolección de basura?
- ¿Ocurren demasiadas recolecciones?
- Espacio libre en función de cantidad de recolecciones de GC.
- ¿Sucedió un crash durante una recolección?
Si la opción verboseGC está habilitada, entonces, cuando se requiera recolectar información para analizar un problema podremos hacerlo sin demoras. De lo contrario, habrá que esperar a habilitarla y luego aguardar a que vuelva a ocurrir el problema para recién en la segunda ocurrencia poder juntar la información para el análisis (podría ser mucho tiempo). Entre otras cosas, esta información es importante al momento de determinar si el heap es muy grande o muy pequeño.
A continuación se muestra cómo habilitar verboseGC desde la consola administrativa de WebSphere:
Read the rest of this entry →