2009-04-07 13 views
10

Ejecutar JVisualVM (Windows XP, Sun Java 1.6.0.13, VM de cliente de 32 bits) para monitorear una aplicación distante (Linux, Sun Java 1.6.0.07, VM de servidor de 64 bits) Antes de iniciar la aplicación remota real, pongo en marcha de la máquina remota jstatd utilizando una política de todos los accesos:Obtener el volcado del heap desde una aplicación remota en Java usando JVisualVM

grant codebase "file:${java.home}/../lib/tools.jar" { 
    permission java.security.AllPermission; 
}; 

Entonces comienzo de la aplicación real utilizando la línea de comandos

java -Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=3333 
compileTest.Main 

Desde la máquina cliente, I puede ver la aplicación distante y monitorearla. También puedo hacer un volcado de subprocesos, etc. Desafortunadamente, el botón de volcado dinámico está atenuado.

¿Cómo puedo obtener un heap-dump de una aplicación remotamente monitoreada utilizando JVisualVM?

Intenté usar jConsole. Con jConsole, es posible crear un volcado de montón distante utilizando la operación com.sun.management.HotSpotDiagnostic dumpHeap. Quiero que el volcado sea transferido al lado del cliente y analizado usando las herramientas provistas por JVisualVM. ¿Cómo puedo hacer esto?

+0

corriendo jvisualvm como el mismo usuario que ejecuta el proceso java puede ayudar – rogerdpack

+0

@rogerdpack buen punto! Navegué para llegar a esta pregunta/tema, ya que tengo la misma pregunta que http://stackoverflow.com/questions/8799929/visualvm-unable-to-sampler-memory, y creo que su declaración/suposición es correcta. Cuando ejecuto tomcat/tomee a través de mi NetBeans IDE en mi PC/servidor desarrollador, entonces el botón Sampler> Memory está habilitado, pero el botón Sampler> Memory está deshabilitado en el servidor de producción, ya que tomcat/tomee se está ejecutando como servicio de Windows, y 'm' no 'inició sesión en el servicio de producción como sistema o servicio local. :( – Howard

Respuesta

0

No se puede analizar el montón de forma remota. Puede ejecutar visualvm en su servidor y exportar la sesión x a su máquina local. Debería tener x11 instalado en su servidor, lo que muchos servidores no tienen.

3

Lamentablemente, no existe una forma automática de hacerlo. Tendrá que ejecutar jmap manualmente en el servidor Linux para volcar el montón de su JVM y luego copiar el volcado de pila resultante en su máquina local ejecutando JVisualVM y usar File | Load ... para cargar el volcado de pila en JVisualVM para su análisis.

6

¡Hay una forma de hacerlo!

  1. rmiregistry -J-Xbootclasspath/p: $ JAVA_HOME/lib/sa-jdi.jar (este utiliza el puerto 1099) inicio
  2. 'jsadebugd' en la máquina en la que se ejecuta la aplicación: jsadebugd & (pid de JVM)
  3. En uso de la máquina a distancia siguiente -dump jmap: file =: 1099

  4. jhat

Lo anterior se iniciará una aplicación web en el puerto 7000

Todas las herramientas anteriores son parte de JDK 1.6

Todo lo mejor!

+0

¿Esto daría lugar a una penalización de rendimiento para la aplicación en ejecución? Tal vez eso no importe. –

2

Desde 1.3, VisualVM apoyo montón remota vertederos:

A partir de VisualVM 1.3, ahora se puede utilizar el Heap Dump acciones y botones en la herramienta para tomar un volcado del montón de aplicaciones que se ejecutan de forma remota. Cuando se invoca, se muestra un cuadro de diálogo que le permite especificar la ruta completa en el sistema remoto donde desea volcar el montón. Después de crear el volcado del montón, debe copiarlo manualmente en su máquina local y usar la acción Cargar para abrir y analizar el archivo con VisualVM.

Ver: VisualVM 1.3 Released

Cuestiones relacionadas