Comment activer JMX sur mon JVM pour accéder à jconsole?
comment activer JMX sur un JVM pour accéder avec jconsole?
7 réponses
la documentation pertinente se trouve ici:
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
démarrez votre programme avec les paramètres suivants:
-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
par exemple comme ceci:
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
n'est pas nécessairement requis
mais sans lui, il ne fonctionne pas sur Ubuntu. L'erreur serait quelque chose comme
ce:
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.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)
voir http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672
aussi faire attention avec -Dcom.sun.management.jmxremote.authenticate=false
qui
permet l'accès à tout le monde, mais si vous ne l'utilisez que pour suivre la
votre machine locale, il n'a pas d'importance.
mise à Jour :
dans certains cas, je n'ai pas pu atteindre le serveur. Ce fut alors fixe si je mets ce paramètre aussi bien: -Djava.rmi.server.hostname=127.0.0.1
courir dans un conteneur Docker a introduit toute une série de problèmes supplémentaires pour se connecter donc espérons que cela aide quelqu'un. J'ai besoin d'ajouter les options suivantes que je vais expliquer ci-dessous:
-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
contrairement à l'utilisation de jconsole localement, vous devez annoncer une IP différente que vous verrez probablement de l'intérieur du conteneur. Vous devrez remplacer ${DOCKER_HOST_IP}
par le IP résolvable extérieurement (nom DNS) de votre hôte Docker.
JMX Remote & RMI Ports
il semble que JMX nécessite également l'accès à une interface de gestion à distance ( jstat ) que utilise un port différent pour transférer certaines données lors de l'arbitrage de la connexion. Je n'ai rien vu immédiatement évident dans jconsole
pour définir cette valeur. Dans l'article lié le processus était:
- essayez de vous connecter à partir de
jconsole
avec journalisation activée - Fail
- déterminer quel port
jconsole
a tenté d'utiliser - Utiliser
iptables
/firewall
règles nécessaires pour permettre à ce port pour connecter
bien que cela fonctionne, ce n'est certainement pas une solution automatique. J'ai opté pour une mise à niveau de JConsole à VisualVM puisqu'il vous permet de spécifier explicitement le port sur lequel jstatd
est en cours d'exécution. Dans VisualVM, ajouter un nouvel hôte distant et le mettre à jour avec des valeurs qui correspondent à celles spécifiées ci-dessus:
puis clic droit sur la nouvelle connexion à distance de L'hôte et Add JMX Connection...
N'oubliez pas de cocher la case Do not require SSL connection
. Espérons-le, qui devrait vous permettre de vous connecter.
Note, Java 6 dans la dernière incarnation permet à jconsole de s'attacher à un processus en cours d'exécution même après qu'il a été lancé sans incantations JMX.
si cela est disponible pour vous, considérez aussi jvisualvm car il fournit une mine d'informations sur les processus en cours d'exécution, y compris un profileur.
j'utilise WAS ND 7.0
Mon JVM besoin de tous les arguments suivants à surveiller dans la 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
sous Linux, j'ai utilisé les params suivants:
-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
et aussi j'ai édité /etc/hosts
pour que le nom d'hôte se résolve à l'adresse hôte (192.168.0.x) plutôt que l'adresse de boucle (127.0.0.1)
exécutez votre application java avec les paramètres de ligne de commande suivants:
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
il est important d'utiliser le - Dcom.soleil.gestion.jmxremote.ssl = faux paramètre si vous ne voulez pas configurer les certificats numériques sur l'hôte jmx.
si vous avez démarré votre application sur une machine ayant une adresse IP 192.168.0.1 , ouvrez jconsole , mettez 192.168.0.1: 8855 dans le champ Remote Process , et cliquez sur Connect .
j'ai eu ce problème précis, et a créé un projet GitHub pour tester et comprendre les paramètres corrects .
il contient un Dockerfile
de travail avec des scripts de soutien, et un simple docker-compose.yml
pour des tests rapides.