2010-06-28 6 views
5

Estoy intentando diagnosticar un problema de pérdida de memoria PermGen en un servidor de aplicaciones Sun One 9.1. Para hacer eso, necesito obtener un volcado de pila del proceso de JVM. Desafortunadamente, el proceso de JVM es la versión 1.5 ejecutándose en Windows. Aparentemente, ninguna de las formas para activar un volcado de pila admite esa configuración. Puedo hacer que la JVM haga un volcado de pila después de que se quede sin memoria o cuando se apague, pero necesito poder descargar volcados de memoria en momentos arbitrarios.Desencadenante de volcado de desencadenador de una JVM 1.5 que se ejecuta en Windows

Las dos formas mencionadas a menudo para obtener volcados de almacenamiento dinámico son usar jmap o usar el HotSpotDiagnostic MBean. Ninguno de los dos admite jvm 1.5 en Windows.

¿Hay algún método que me haya pasado por alto? Si hay una forma de activar mediante programación un volcado de almacenamiento dinámico (sin utilizar el HotSpotDiagnostic MBean), eso también lo haría ...

Si no es posible hacerlo en Windows, supongo que tendré que recurrir a la construcción una máquina virtual Linux y haciendo mi depuración allí.

Gracias.

+1

he recurrido a la utilización de -XX: + HeapDumpOnOutOfMemoryError junto con una página jsp que intenta asignar matrices muy grandes. Solo puedo acceder a la página jsp cuando necesito un volcado de memoria. Funciona lo suficientemente bien. – jthg

Respuesta

1

Hubo una nueva opción de punto de acceso introducida en Java6, -XX:-HeapDumpOnOutOfMemoryError, que en realidad se transfirió a la Java5 JVM.

http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

volcado de pila de archivo cuando se lanza java.lang.OutOfMemoryError. Gestionable. (Presentado en 1.4.2 actualización 12, actualización 5.0 7.)

Es muy útil. La JVM vive el tiempo suficiente para volcar su pila a un archivo y luego se cae.

Por supuesto, significa que tienes que esperar a que la fuga sea lo suficientemente grave como para activar OutOfMemoryError.

Una alternativa es utilizar un generador de perfiles, como YourKit. Esto proporciona los medios para tomar una instantánea de montón de una JVM en ejecución. Creo que todavía es compatible con Java5.

P.S. Usted realmente necesita actualizar a Java 6 ....

+0

Gracias. He estado usando este método, pero no es suficiente. Necesito de alguna manera activar un volcado de pila en un momento arbitrario. – jthg

+0

@jthg: Vea la sugerencia del generador de perfiles que hice también – skaffman

+0

Pensaré en el generador de perfiles si no hay una solución gratuita. – jthg

0

Si se trata de 1.5.0_14 o posterior, puede utilizar -XX:+HeapDumpOnCtrlBreak y pulsa Ctrl-Break en la consola

+0

¿Puede Ctrl-Break enviarse a un procesar si no hay consola? ¿O sabe si hay alguna manera de que el servidor de Sun One App mantenga abierta una consola para el proceso de jvm? – jthg

+0

No estoy seguro acerca del servidor de Sun One. Las formas más comunes son: 1- editar scripts de inicio (si están presentes) y reemplazar javaw con java; 2- encontrar la clase principal y ejecutarla manualmente – unbeli

Cuestiones relacionadas