2009-08-12 9 views
8

Tenemos una aplicación de servidor de larga ejecución que ejecuta Java 5, y al perfilarla podemos ver que la generación anterior crece lentamente con el tiempo. Está liberado correctamente en un GC completo, pero me gustaría poder mirar los objetos inalcanzables en Eclipse MAT usando un volcado de pila. Obtuve exitosamente un volcado de pila con + XX: HeapDumpOnCtrlBreak, pero la JVM siempre hace un GC antes de volcar el montón. Aparentemente esto no ocurre en Java 6, pero estamos estancados en 5 por ahora. hay alguna forma de prevenir esto?¿Cómo puedo hacer un volcado de heap en Java 5 sin recoger basura primero?

Respuesta

1

Sugiero un generador de perfiles de terceros como YourKit, que puede permitirle tomar instantáneas sin iniciar antes el GC. Además, puedes tomar una instantánea sin las trampas de ctrl-break.

+0

Gracias, en realidad tiene una copia de JProfiler, pero no me di cuenta que podía hacer esto. Voy a darle una oportunidad. – Colin

3

tengo algo de código aquí que la programación puede tomar un volcado del montón sobre JMX:

Enlace: JmxHeapDumper.java

Los comentarios en el código fuente contienen 2 enlaces a artículos que contenían información útil acerca de cómo tomar montón deshecho. No estoy seguro, pero si tiene suerte, tal vez el enfoque JMX tendría alguna forma de evitar el GC. Espero que esto ayude !

+0

Genial, gracias, voy a echar un vistazo y ver si es GC de antemano o no. Ser capaz de hacerlo programáticamente parece bastante útil, en realidad. – Colin

4

¿Has probado la herramienta estándar jmap enviada con el JDK? La cifra de jmap se introdujo oficialmente en Java 5.

Ejemplo línea de comando: /java/bin/jmap -heap: format = b

El resultado puede ser procesada con la herramienta jhat estándar o con aplicaciones GUI como MAT.

9

use jconsole o visualvm o jmc o ... otra consola de administración de jmx. abrir HotSpotDiagnostic en com.sun.management. Elija un método para dumpHeap y la entrada de dos parámetros:

  • ruta de acceso al archivo de volcado
  • (verdadero/falso) descargan objetos solamente en directo. use false para volcar todos los objetos.

Tenga en cuenta que el archivo de volcado será escrito por la JVM a la que se conectó, no por JVisualVM, por lo que si la JVM se ejecuta en un sistema diferente, se escribirá en ese sistema.

enter image description here

+0

Esta debería ser la respuesta aceptada, ya que solo usa las herramientas normales incluidas con el JDK. – mjuarez

+1

Tenga en cuenta que VisualVM requiere el complemento 'VisualVM-MBeans' para esto. – Natan

Cuestiones relacionadas