2008-09-28 10 views
15

He logrado obtener una "fuga" de memoria en una aplicación Java que estoy desarrollando. Al ejecutar mi conjunto de pruebas JUnit, obtengo al azar excepciones de memoria (java.lang.OutOfMemoryError).¿Cómo puedo ver qué hay en mi montón en Java?

¿Qué herramientas puedo usar para examinar el montón de mi aplicación java para ver qué está usando todo mi montón para poder averiguar qué es lo que mantiene las referencias a los objetos que deberían poder recogerse como basura?

Respuesta

23

VisualVM está incluido en las versiones más recientes de Java. Puede usar esto para crear un volcado de pila y observar los objetos en él.

Como alternativa, también se puede crear un commandine Heapdump usando jmap (en su JDK/dir bin):

jmap -dump:format=b,file=heap.bin <pid> 

Usted puede incluso utilizar esto para obtener un histograma rápido de todos los objetos

jmap -histo <pid> 

Puedo recomendar Eclipse Memory Analyzer (http://eclipse.org/mat) para un análisis avanzado de volcados de almacenamiento dinámico. Le permite descubrir exactamente por qué un determinado objeto o conjunto de objetos está vivo. Aquí hay una entrada de blog que le muestra lo que Memory Analyzer puede hacer: http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/27/automated-heap-dump-analysis-finding-memory-leaks-with-one-click/

+0

Visual VM y Netbeans Profiler le permiten hacer lo mismo que EMA. –

+1

No sé acerca de netbeans, pero ciertamente no he encontrado el 'camino más corto a la raíz de gc' en visual vm. – Tom

+1

+1 para EMA - salvavidas. –

0

Si está utilizando un sistema que admite GTK, puede intentar usar JMP.

6

Si necesita algo libre, trate de VisualVM

Por la descripción del proyecto :

VisualVM es una herramienta visual que integra herramientas JDK de línea de comandos y capacidades de generación de perfiles livianas. Diseñado tanto para el desarrollo como para el uso del tiempo de producción.

0

Puede probar el Detector de fugas de memoria que forma parte del conjunto de herramientas de control de misión de JRockit. Le permite inspeccionar el montón mientras se ejecuta la JVM. No necesita tomar instantáneas todo el tiempo. Puede conectarse en línea a la JVM y luego ver cómo cambia el montón entre colecciones de basura. También puede inspeccionar objetos, seguir referencias gráficamente y obtener rastros de pila desde donde su aplicación está asignando objetos actualmente. Aquí hay un breve introduction.

La herramienta es gratuita para el desarrollo y se puede descargar here.

1

Uso los vuelcos de almacenamiento dinámico Eclipse Memory Analyzer

No hay otra herramienta que estoy al tanto de cualquier herramienta que se acerca a su funcionalidad y rendimiento y precio (libre y de código abierto) al analizar.

2

Esta es una pregunta muy antigua. Mucha gente podría haber comenzado a usar IntelliJ desde que fue respondida originalmente. IntelliJ tiene un complemento que puede mostrar el uso de memoria llamado JVM Debugger Memory View.

+0

Después de jugar un poco con diferentes herramientas, descubrí que IntelliJ también tiene un [complemento para VisualVM] (https://plugins.jetbrains.com/plugin/7115-visualvm-launcher) (mencionado en una respuesta diferente). Esa combinación terminó funcionando mejor para mí. – mkasberg

Cuestiones relacionadas