2011-07-28 39 views
7

Sospecho que hay una pérdida de memoria nativa en mi código de Java. ¿Hay alguna herramienta que haga perfiles de memoria nativos? Además, ¿admite alguna herramienta el análisis de memoria nativo de un proceso Java en ejecución?Herramientas para el análisis de fugas de memoria nativa

Gracias!

Edit: Ya he probado Memory Validator and Purify pero parece que solo admiten procesos de 32 bits. ¿Hay alguna herramienta similar a las anteriores que simplemente se pueda conectar a un proceso de Windows en ejecución y nos brinde análisis de memoria nativos para ese proceso en particular?

Respuesta

-6

Soy un gran admirador de JProfiler. Esa es la mejor herramienta para generar perfiles y pérdidas de memoria. Es relativamente económico en relación con la mayoría de las herramientas, muy fácil de aprender y con muchas funciones.

http://www.ej-technologies.com/products/jprofiler/overview.html

+1

JProfiler es un buen perfilador que también permite el seguimiento de la creación de objetos. Pero eso no está relacionado con las asignaciones de heap nativas. – eckes

2

yo sepa no se puede hacer con las herramientas Java, como JProfiler, etc. jvisualvm Si usted tiene pérdida de memoria en utilizar herramientas de código nativo para código nativo. Usted es decir. puede ejecutarlo desde C (es decir, cargando jvm.dll). Puede mirar estos artículos finding memory leaks using Visual Studio o Memory Leak Detection in C++ (Linux)

Nota: por supuesto si su fuga está conectada a Heap leak (se olvidó de deleteglobalref) puede encontrarla con herramientas Java, pero es muy raro en JNI.

4

El Troubleshooting guide for Java SE 6 with Hotspot VM contiene una sección bastante elaborada sobre técnicas para ayudar a detectar fugas de memoria nativa. Estos incluyen:

  • envolviendo todas las llamadas de asignación de memoria y desasignación para rastrear la cantidad de memoria utilizada.
  • confiando en soporte específico de plataforma como el soporte de depuración proporcionado por el compilador de Microsoft Visual C++ o en mtrace (y MALLOC_TRACE) para depurar asignaciones de memoria en Linux.
  • usando herramientas de análisis de pérdida de memoria como Rational Purify.

entre otros. Notablemente, el artículo menciona que no existe una solución ideal para todas las plataformas.

Además, considere utilizar el indicador -Xcheck:jni que parece estar disponible en la mayoría de las JVM. El indicador -X indica que el indicador no es estándar, pero el indicador parece estar disponible en IBM JDK, Oracle JRockit R28 e incluso Oracle/Sun JVM. La habilitación de la bandera cambia a un modo donde se agregan envolturas alrededor de llamadas JNI, lo que le permite rastrear argumentos ilegales pasados ​​a llamadas JVM como se indica en el JNI programmers' guide and specification. Si bien, su uso en la detección de fugas de memoria es subjetivo, definitivamente ayudaría si sospecha que la fuga se debe a la emisión de parámetros no válidos.

1

He estado trabajando en un proyecto de código abierto llamado "MySafe" (https://github.com/serkan-ozal/mysafe) Básicamente intercepta y monitorea llamadas "inseguras". (De hecho, gana más que). Con la versión 2.0, puede ser útil para rastrear y detectar fugas de memoria nativa basadas en "No segura".

código de demostración: https://github.com/serkan-ozal/mysafe/blob/master/src/test/java/tr/com/serkanozal/mysafe/NativeMemoryLeakHuntingDemo.java

Diagrama que muestra la fuente de la fuga: https://github.com/serkan-ozal/mysafe/blob/master/src/test/resources/native-memory-leak-hunting.png

Cuestiones relacionadas