¿Cómo activar JMX en una JVM para acceder con jconsole?¿Cómo activar JMX en mi JVM para acceder con jconsole?
Respuesta
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
La -Dcom.sun.management.jmxremote.local.only = false es necesaria también en Centos ahora – LenW
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
"-Djava.rmi.server.hostname" funcionó como un amuleto para mí. –
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.
Esto solo funciona si está ejecutando jconsole en el mismo host que la JVM que está intentando monitorear. – Gray
@ 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). –
La API adjunta requiere que jconsole tenga la misma JVM de 32/64 bits que el programa iniciado en algunas plataformas. –
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 .
¿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
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
Sí, tu respuesta funcionó para mí (JDK 1.7, Windows 8.1 de 64 bits) –
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)
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:
A continuación, haga clic en la nueva conexión de host remoto y Add JMX Connection...
No olvide marcar la casilla de verificación para Do not require SSL connection
. Espero que eso te permita conectarte.
Gracias por tu minuciosa explicación, me ahorró horas de tiempo. –
Tuve este problema y created a GitHub project for testing and figuring out the correct settings.
Contiene un trabajo Dockerfile
con scripts de apoyo, y un simple docker-compose.yml
para pruebas rápidas.
- 1. Deshabilitar las conexiones JMX locales en JVM
- 2. ¿Cómo tener un solo proxy JMX para múltiples JVM?
- 3. Cómo conectarse a un programa Java en localhost jvm usando JMX?
- 4. ¿Cómo habilita JMX en Websphere?
- 5. Conexión de la instancia de JMX de tomcat remoto con jConsole
- 6. Conexión JMX remota
- 7. ¿Cómo uso Jconsole para conectarme a EC2?
- 8. Cómo habilitar JMX en Weblogic 10.x
- 9. ¿Cómo creo un volcado de hilo a través de JMX?
- 10. Monitor c3p0 (con hibernación y Tomcat) con JConsole
- 11. Consola JMX basada en Web para Tomcat?
- 12. ¿Cómo debo acceder a un JMX MBeanServer que se ejecuta en la misma máquina virtual?
- 13. Monitorización JMX con Zabbix
- 14. configurar JMX para ActiveMQ para acceso remoto
- 15. Habilitar JMX remoto en Jetty
- 16. Uso de Jconsole para pérdida de memoria
- 17. Cómo conectarme al agente JMX usando python
- 18. ¿Cómo averiguar qué algoritmo [cifrado] son compatibles con mi JVM?
- 19. Cómo establecer el nombre de net.sf.ehcache.CacheManager para la supervisión JMX?
- 20. Programemente obtener información del montón usando jmx con java 5
- 21. ¿cómo configuro la configuración regional predeterminada para mi JVM?
- 22. Acceder a agentes JMX de clientes que no son Java
- 23. Consola JBoss AS 7 JMX
- 24. Cómo usar getSystemCpuLoad() en JMX
- 25. ¿Por qué triggerJob está deshabilitado en Quartz's JMX?
- 26. diferencia entre JMX y RMI
- 27. ¿Cómo encontrar el puerto JMX en un servidor?
- 28. Depuración Error de conexión de JConsole
- 29. ¿Dónde está JConsole en Leopard
- 30. ¿Cómo hacer que JMX se una a una interfaz específica?
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
Stack Exchange siempre ha alentado explícitamente a los usuarios a responder sus propios preguntas, consulte aquí: http://stackoverflow.com/help/self-answer –
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á. –