introduccion - java basico platzi
¿Estrategia general para resolver la fuga de memoria de Java? (6)
Tengo un programa independiente que ejecuto localmente, está destinado a ser un programa de tipo servidor que funciona 24/7. Recientemente descubrí que tiene una pérdida de memoria, en este momento nuestra única solución es reiniciarlo cada 4 horas. ¿Cuál es la mejor manera de encontrar esta fuga de memoria? ¿Qué herramienta y método deberíamos usar?
Cuando se trata de cazar problemas de memoria, uso SAP Memory Analyzer Eclipse Memory Analyzer (MAT) , una herramienta de análisis de Heap Dump.
El Analizador de memoria proporciona un conjunto de herramientas de propósito general para analizar volcados de almacenamiento dinámico de Java. Además de andar en montón y un cálculo rápido de los tamaños retenidos, la herramienta Eclipse informa acerca de los sospechosos de fugas y el consumo de memoria antipatrones. El área principal de aplicación son los Errores de memoria insuficiente y el alto consumo de memoria.
Iniciado por SAP, el proyecto se ha abierto desde ahora y ahora se conoce como Eclipse Memory Analyzer . Consulte la página Introducción y especialmente la sección Buscar pérdidas de memoria (la voy a pegar más abajo porque he corregido algunos enlaces):
Comience ejecutando el informe de fugas para verificar automáticamente si hay pérdidas de memoria.
Este blog detalla Cómo encontrar una ventana de entorno de trabajo con pérdidas .
Memory Analyzer creció en SAP. En ese entonces, Krum escribió en su blog acerca de Finding Memory Leaks con SAP Memory Analyzer . ¡El contenido sigue siendo relevante!
Esta es probablemente la mejor herramienta que puede obtener (incluso para dinero) para análisis de volcado de pila (y pérdidas de memoria).
PD: No trabajo para SAP / IBM / Eclipse, solo soy un usuario MAT muy feliz con comentarios positivos.
Necesitas un generador de perfiles de memoria . Recomiendo probar el generador de perfiles Netbeans .
Puede buscar JMX y la aplicación jconsole que se envía con Java. Puede obtener algunas estadísticas interesantes listas para usar, y agregar algunos instrumentos simples a sus clases puede proporcionar mucho más.
Si está utilizando Java desde Sun y usa al menos la actualización 10 de Java 6 (es decir, la más reciente), intente ejecutar jvisualvm desde el JDK en la misma máquina que su programa y conéctelo y habilite la generación de perfiles.
Esta es probablemente la manera más simple de comenzar.
Un enfoque sería tomar volcados de almacenamiento de forma regular, luego realizar una tendencia de los recuentos de instancias de las clases para intentar determinar qué objetos se crean constantemente pero no se recopilan.
Otra sería desactivar partes de su aplicación para intentar reducir el problema.
Mira herramientas como jmap y jhat.
Como ya se dijo, jvisualvm es una gran manera de comenzar, pero una vez que sepa lo que se está filtrando, es posible que deba encontrar lo que contiene referencias a los objetos en cuestión, para lo cual recomendaría jmap y jhat, por ej.
jmap -dump:live,file=heap.dump.out,format=b <pid>
y
jhat heap.dump.out
donde <pid> se encuentra fácilmente desde jvisualvm. Luego, en un navegador, navegue a localhost: 7000 y comience a explorar.