Comment activer JMX sur une machine virtuelle pour un accès avec jconsole?
La documentation pertinente peut être trouvée 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 cela, cela ne fonctionnerait pas sur Ubuntu. L'erreur serait quelque chose comme Ceci:
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)
voir http://bugs.Sun.com/bugdatabase/view_bug.do?bug_id=6754672
Faites également attention avec -Dcom.Sun.management.jmxremote.authenticate=false
, ce qui rend l'accès accessible à tout le monde, mais si vous ne l'utilisez que pour suivre la JVM sur Votre machine locale, cela n'a pas d'importance.
Mettre à jour:
Dans certains cas, je n'ai pas pu atteindre le serveur. Ceci a ensuite été corrigé si je définissais également ce paramètre: -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 la connexion, alors espérons que cela aidera quelqu'un. J'ai fini par avoir besoin d'ajouter les options suivantes que j'expliquerai 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 locale de jconsole, vous devez publier une adresse IP différente de celle que vous verrez probablement dans le conteneur. Vous devrez remplacer ${DOCKER_Host_IP}
par l'adresse IP (nom DNS) pouvant être résolue en externe de votre hôte Docker.
Ports JMI et RMI
Il semble que JMX nécessite également l'accès à une interface de gestion à distance ( jstat ) qui utilise un autre port pour transférer des données lors de l'arbitrage de la connexion. Je n'ai rien vu de suite dans jconsole
pour définir cette valeur. Dans l'article lié, le processus était le suivant:
jconsole
avec la journalisation activéejconsole
a tenté d'utiliseriptables
/firewall
si nécessaire pour permettre à ce port de se connecterBien que cela fonctionne, ce n'est certainement pas une solution automatisable. J'ai opté pour une mise à niveau de jconsole vers VisualVM car cela vous permet de spécifier explicitement le port sur lequel jstatd
est en cours d'exécution. Dans VisualVM, ajoutez un nouvel hôte distant et mettez-le à jour avec les valeurs corrélées à celles spécifiées ci-dessus:
Cliquez ensuite avec le bouton droit sur la nouvelle connexion à l'hôte distant et sur Add JMX Connection...
.
N'oubliez pas de cocher la case Do not require SSL connection
. Espérons que cela devrait vous permettre de vous connecter.
Remarque: Java 6 dans la dernière incarnation permet à jconsole de se connecter à un processus en cours, même après son démarrage sans incantations JMX.
Si cela vous est disponible, pensez également à jvisualvm car il fournit une mine d’informations sur les processus en cours, y compris un profileur.
J'utilise WAS ND 7.0
Ma machine virtuelle Java a besoin de surveiller tous les arguments suivants dans 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 paramètres 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 soit résolu en adresse d'hôte (192.168.0.x) plutôt qu'en adresse de bouclage (127.0.0.1)
avec les paramètres de ligne de commande ci-dessous,
-Dcom.Sun.management.jmxremote.port=9999
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false
Parfois, dans les serveurs linux, la connexion imx ne réussit pas. c'est parce que, dans l'hôte cloud linux, dans/etc/hosts afin que le nom d'hôte soit résolu en adresse d'hôte.
le meilleur moyen de résoudre ce problème est d’envoyer une requête ping au serveur Linux concerné à partir d’une autre machine du réseau et d’utiliser cette adresse IP hôte dans le répertoire.
-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.
Mais ne vous fiez jamais à l'adresse IP que vous obtenez du serveur Linux en utilisant ifconfig.me. l'adresse IP que vous obtenez est masquée par celle qui est présente dans le fichier hôte.
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 paramètre -Dcom.Sun.management.jmxremote.ssl = false si vous ne souhaitez pas configurer de certificats numériques sur l'hôte jmx.
Si vous avez démarré votre application sur un ordinateur dont l'adresse IP est 192.168.0.1, ouvrez jconsole , put 192.168.0.1:8855 dans le champ Remote Process et cliquez sur Relier.
J'ai eu ce problème, et créé un projet GitHub pour tester et déterminer les paramètres corrects .
Il contient une Dockerfile
de travail avec des scripts de prise en charge et un simple docker-compose.yml
pour un test rapide.
Vous devez d’abord vérifier si votre processus Java est déjà en cours d’exécution avec les paramètres JMX. Faire ceci:
ps -ef | grep Java
Vérifiez votre processus Java que vous devez surveiller. Si vous pouvez voir le paramètre jmx rmi Djmx.rmi.registry.port = xxxx , utilisez le port mentionné ici dans votre visualvm Java pour le connecter à distance via une connexion jmx.
Si cela ne fonctionne pas via le port jmx rmi, vous devez exécuter votre processus Java avec les paramètres mentionnés ci-dessous:
-Djmx.rmi.registry.port=1234 -Djmx.rmi.port=1235 -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.ssl=false
Remarque: les numéros de port sont basés sur votre choix.
Vous pouvez maintenant utiliser ce port pour la connexion jmx. Ici c'est le port 1234
.