2009-01-16 19 views
5

La JVM solar escupe MUCHO ruido extra cuando se ejecuta bajo valgrind, lo que hace que el seguimiento de los problemas de memoria en la aplicación sea muy desafiante.Ejecución de una aplicación JNI en Sun VM bajo Valgrind

Me gustaría encontrar un archivo de supresión, o un modo de tiempo de ejecución de VM, que eliminará errores de memoria espurios para separar el trigo de la paja en esta situación. ¿Alguna sugerencia?

+0

He encontrado la localización de problemas de memoria JNI en Win32 no más fácil. –

+0

Si termina creando el archivo de exclusión, ¿le importaría publicarlo aquí? – Arkadiy

Respuesta

1

¿Qué pasa con el perfil de este código nativo fuera de la aplicación Java? Por lo general, el código JNI es una envoltura alrededor de una biblioteca que no es específica de Java. No estoy seguro de si eso es cierto para su caso específico, pero si es así, ¿entonces tal vez los problemas de memoria pueden aislarse escribiendo un marco de prueba simple de C o C++ alrededor de esa biblioteca?

Si su marco de trabajo está en C++, entonces también es posible que pueda suministrar sus propios operadores nuevos y eliminar y realizar un seguimiento del uso de la memoria usted mismo. Deberá recopilar estadísticas y procesarlas con algunos scripts, pero puede funcionar bien.

1

No puedo responder a su pregunta publicada, pero ¿puede explicar qué problema está teniendo?

En otras palabras, ¿puede decirnos si es ...

  • En la capa de JNI y no una cuestión objeto alcance JVM?
  • ¿Un uso de memoria libre?
  • ¿Sobrescribir/sobreescribir?
  • ¿Otra corrupción de memoria?

Recientemente tuve que depurar un Java/C que tenía problemas (después de más de 30 minutos de ejecución), que resultaba que estaba usando memoria después de haber sido liberado. Traté de usar dmalloc, una biblioteca de filtración de memoria personalizada mía, Valgrind y ninguna funcionó como necesitaba.

Eventualmente creé un conjunto simple de envoltorios alrededor de libre, malloc, calloc, realloc que simplemente imprimía direcciones y tamaños de memoria a un archivo. Después de que se abortó (dentro de GDB) pude retroceder en el tiempo y descubrir cuándo se liberó la memoria y dónde estaban las referencias que no se eliminaron.

Si su problema está en C/C++ y puede atrapar el error en un depurador esto podría funcionar para usted. Sí, es tedioso, pero tal vez no sea peor que examinar megabytes de salida de Valgrind.

Espero que ayude & buena suerte.

+0

Estoy buscando identificar fugas proactivamente, no rastrear una que sé que existe. Prefiero evitar tu situación, en realidad :) Es un hábito para mí ejecutar mis aplicaciones a través de valgrind antes de lanzarlas. Sin embargo, la biblioteca JNI hace un poco de hash. –

0

Si bien no es tan bueno como valgrind (basado en lo que he leído), puede probar jmap y jhat. Estas herramientas le permiten tomar una instantánea del proceso en ejecución y ver qué está sucediendo. Utilicé esta técnica para fugas de memoria simples y funcionó bien. Sin embargo, si los problemas de memoria son causados ​​por asignaciones que no son de jvm, esto no ayudará.

Cuestiones relacionadas