Saltar al contenido

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

Investigamos en diferentes espacios y así traerte la solución para tu duda, si tienes alguna pregunta puedes dejar tu comentario y contestamos porque estamos para ayudarte.

Solución:

La documentación relevante se puede encontrar aquí:

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

Inicie su programa con los siguientes parámetros:

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

Por ejemplo así:

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 necesario, pero sin él, no funciona en Ubuntu. El error sería algo 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 lo que hace que el acceso esté disponible para cualquier persona, pero si solo lo usa para rastrear la JVM en su máquina local, no importa.

Actualizar:

En algunos casos, no pude comunicarme con el servidor. Esto luego se solucionó si configuro este parámetro también: -Djava.rmi.server.hostname=127.0.0.1

La ejecución en un contenedor Docker introdujo una gran cantidad de problemas adicionales para la conexión, por lo que es de esperar que esto ayude a alguien. Terminé siendo necesario agregar 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 de usar jconsole localmente, debe anunciar una IP diferente a la que probablemente verá dentro del contenedor. Necesitarás reemplazar $DOCKER_HOST_IP con la IP (nombre DNS) que se puede resolver externamente de su host Docker.

Puertos JMX Remote y RMI

Parece que JMX también requiere acceso a una interfaz de administración remota (jstat) que usa un puerto diferente para transferir algunos datos cuando se arbitra la conexión. No vi ningún lugar inmediatamente obvio en jconsole para establecer este valor. En el artículo vinculado el proceso fue:

  • Intenta conectarte desde jconsole con registro habilitado
  • Fallar
  • Averigua qué puerto jconsole intentó usar
  • Usar iptables/firewall reglas según sea necesario para permitir que ese puerto se conecte

Si bien 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 jstatd Esta corriendo. En VisualVM, agregue un nuevo host remoto y actualícelo con valores que se correlacionen con los especificados anteriormente:

Agregar host remoto

Luego haga clic con el botón derecho en la nueva Conexión de host remoto y Add JMX Connection...

Agregar conexión JMX

No olvide marcar la casilla de verificación Do not require SSL connection. Con suerte, eso debería permitirle conectarse.

Tenga en cuenta que Java 6 en la última encarnación permite que jconsole se adjunte a un proceso en ejecución incluso después de que se haya iniciado sin encantamientos 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *