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


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

Author: Mauli, 2009-05-13

7 answers

La documentación pertinente 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.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 se requiere necesariamente 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)

Véase http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672

También tenga cuidado con -Dcom.sun.management.jmxremote.authenticate=false 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.

Actualización :

En algunos casos no pude llegar al servidor. Esto se corrigió si también establezco este parámetro: -Djava.rmi.server.hostname=127.0.0.1

 237
Author: Mauli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-19 16:13:52

La ejecución en un contenedor Docker introdujo una serie de problemas adicionales para la conexión, por lo que esperamos que esto ayude a alguien. Terminé necesité 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 del uso local de jconsole, debe anunciar una IP diferente de la que probablemente verá dentro del contenedor. Tendrá que reemplazar ${DOCKER_HOST_IP} con la IP (Nombre DNS) resoluble externamente de su Docker host.

JMX Puertos remotos y RMI

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

  • Intente conectarse desde jconsole con el registro habilitado
  • Fail
  • Averigüe qué puerto jconsole intentó utilizar
  • Uso iptables/firewall reglas necesarias 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 se está ejecutando. 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 derecho en el nuevo Host remoto Conexión y Add JMX Connection...

Añadir conexión JMX

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

 34
Author: Joel B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-19 16:14:40

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 JMX encantations.

Si eso 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.

 9
Author: Thorbjørn Ravn Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-13 16:48:09

Estoy usando WAS ND 7.0

Mi JVM necesita que todos los siguientes argumentos sean monitoreados 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
 7
Author: user3013578,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-10 13:43:06

En Linux, usé los siguientes parámetros:

-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 edité /etc/hosts para que el nombre de host se resuelva a la dirección de host (192.168.0.x) en lugar de la dirección de bucle invertido (127.0.0.1)

 6
Author: alex.pulver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-12 15:38:54

Ejecute su 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 usar el -Dcom.sol.gestión.jmxremote.ssl=false parámetro si no desea configurar certificados digitales en el host jmx.

Si inició su aplicación en una máquina con dirección IP192.168.0.1, abrir jconsole , poner 192.168.0.1:8855 en el campo Remote Process y haga clic en Connect.

 2
Author: Wasif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-12 10:22:42

Tuve este problema exacto, y creé un proyecto de GitHub para probar y averiguar la configuración correcta.

Contiene un Dockerfile funcional con scripts de soporte, y un docker-compose.yml simple para pruebas rápidas.

 0
Author: cstroe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-23 10:43:55