2009-05-13 16 views
153

¿Cómo activar JMX en una JVM para acceder con jconsole?¿Cómo activar JMX en mi JVM para acceder con jconsole?

+30

está permitido, y en realidad solo es un recordatorio para mí, porque siempre olvido de dónde copiar los parámetros y ahora sé dónde lo encuentro :-) – Mauli

+18

Stack Exchange siempre ha alentado explícitamente a los usuarios a responder sus propios preguntas, consulte aquí: http://stackoverflow.com/help/self-answer –

+10

Más de una vez he buscado SO para algo y he encontrado una pregunta respondida ... por mí mismo. Y uno de esos fue preguntado por mí también. Es por eso que es bueno poner sus propias respuestas. Además, piense en todas las otras personas que pueden haber encontrado su problema. Si responde su pregunta, también los ayudará. –

Respuesta

222

La documentación pertinente se puede encontrar aquí:

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html

comenzar su programa con los parámetros siguientes:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9010 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 

por ejemplo a esto:

java -Dcom.sun.management.jmxremote \ 
    -Dcom.sun.management.jmxremote.port=9010 \ 
    -Dcom.sun.management.jmxremote.local.only=false \ 
    -Dcom.sun.management.jmxremote.authenticate=false \ 
    -Dcom.sun.management.jmxremote.ssl=false \ 
    -jar Notepad.jar 

-Dcom.sun.management.jmxremote.local.only=false no es necesariamente se requiere pero sin eso, no funciona en Ubuntu. El error sería algo así como esto:

01 Oct 2008 2:16:22 PM sun.rmi.transport. customer .TCPTransport$AcceptLoop executeAcceptLoop 
WARNING: RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=37278] throws 
java.io.IOException: The server sockets created using the LocalRMIServerSocketFactory only accept connections from clients running on the host where the RMI remote objects have been exported. 
    at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:89) 
    at sun.rmi.transport. customer .TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:387) 
    at sun.rmi.transport. customer .TCPTransport$AcceptLoop.run(TCPTransport.java:359) 
    at java.lang.Thread.run(Thread.java:636) 

ver http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672

También tenga cuidado con -Dcom.sun.management.jmxremote.authenticate=false cuales hace que el acceso está disponible para cualquier persona, pero si sólo lo utiliza para realizar un seguimiento de la JVM en su máquina local, no importa.

actualización:

En algunos casos no fue capaz de alcanzar el servidor. Esto también se corrigió si establecí este parámetro: -Djava.rmi.server.hostname=127.0.0.1

+8

La -Dcom.sun.management.jmxremote.local.only = false es necesaria también en Centos ahora – LenW

+0

Nit pick: Es extraño para mí que 'com.sun.management.jmxremote' tenga el valor predeterminado como' true'. (¡Gracias Sun!) Para ser súper claro, especialmente para aquellos menos familiarizados con los nobs de JMX, uso: 'com.sun.management.jmxremote = true' Ref: http://docs.oracle.com/javase/8/ docs/technotes/guides/management/agent.html – kevinarpe

+0

"-Djava.rmi.server.hostname" funcionó como un amuleto para mí. –

9

Nota, Java 6 en la última versión permite que jconsole se una a sí mismo a un proceso en ejecución incluso después de que se haya iniciado sin conjuros JMX.

Si está disponible para usted, también considere jvisualvm, ya que proporciona una gran cantidad de información sobre los procesos en ejecución, incluido un generador de perfiles.

+3

Esto solo funciona si está ejecutando jconsole en el mismo host que la JVM que está intentando monitorear. – Gray

+1

@ Thorbjorn Si comienzo mi programa java sin ningún parámetro y trato de conectarme con jconsole, veo en mi programa en la lista, pero cuando intento conectarlo falla. Creo que es por falta de certificados SSL. Solo quería ver la demostración, por lo tanto, tuve que usar los parámetros especificados en la respuesta por parte del usuario3013578 y funcionó para mí (JDK 1.7, Windows 8.1, 64 bit). –

+2

La API adjunta requiere que jconsole tenga la misma JVM de 32/64 bits que el programa iniciado en algunas plataformas. –

2

ejecutar la aplicación Java con los siguientes parámetros de línea de comandos:

-Dcom.sun.management.jmxremote.port=8855 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 

Es importante utilizar el -Dcom.sun.management.jmxremote.ssl = false parámetro si no desea configurar certificados digitales en el host jmx.

Si ha iniciado su aplicación sobre una máquina con dirección IP 192.168.0.1 , abierta jconsole, poner 192.168.0.1:8855 en el campo remoto Proceso y haga clic en Conectar .

+0

¿Cuál es el comportamiento esperado si olvida '-Dcom.sun.management.jmxremote.ssl = false'? ¿Debe 'jconsole' mostrar un error, o simplemente no puede conectarse? – amacleod

7

Estoy usando WAS ND 7.0

Mi JVM es necesario que todos los siguientes argumentos para ser monitoreada en JConsole

-Djavax.management.builder.initial= 
    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=8855 
    -Dcom.sun.management.jmxremote.authenticate=false 
    -Dcom.sun.management.jmxremote.ssl=false 
+0

Sí, tu respuesta funcionó para mí (JDK 1.7, Windows 8.1 de 64 bits) –

6

En Linux, que utilizan los siguientes parametros:

-Djavax.management.builder.initial= 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9010 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 

y también he editado /etc/hosts por lo que ésta se resuelve el nombre de host a la dirección de host (192.168.0.x) en lugar de a la dirección de bucle invertido (127.0.0.1)

19

Correr en un contenedor Docker introdujo una gran cantidad de addit problemas de conexión, así que con suerte esto ayuda a alguien. Terminé necesario para añadir las siguientes opciones que explicaré a continuación:

-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=${DOCKER_HOST_IP} -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9998

DOCKER_HOST_IP

A diferencia del uso jconsole localmente, usted tiene que anunciar una IP diferente de lo que probablemente verá desde dentro del contenedor. Tendrá que reemplazar ${DOCKER_HOST_IP} con la IP (nombre DNS) que se puede resolver desde el exterior de su host Docker.

JMX remoto & RMI Puertos

Parece que JMX también requiere acceso a una interfaz de gestión remota (jstat) que uses a different port transferir algunos datos cuando el arbitraje de la conexión. No vi nada obvio de inmediato en jconsole para establecer este valor. En el artículo enlazado el proceso fue:

  • intento y conecto de jconsole con registro habilitado
  • Falla
  • Averiguar qué puerto jconsole intentó utilizar
  • Uso iptables/firewall reglas como sea necesario para permitir que puerto para conectar

Mientras eso funciona, ciertamente no es una solución automatizable. Opté por una actualización de jconsole a VisualVM, ya que le permite especificar explícitamente el puerto en el que se está ejecutando jstatd. En VisualVM, añadir un nuevo host remoto y actualizarlo con los valores que se correlacionan con los especificados anteriormente:

Add Remote Host

A continuación, haga clic en la nueva conexión de host remoto y Add JMX Connection...

Add JMX Connection

No olvide marcar la casilla de verificación para Do not require SSL connection. Espero que eso te permita conectarte.

+0

Gracias por tu minuciosa explicación, me ahorró horas de tiempo. –

Cuestiones relacionadas