Comment activer JMX sur mon JVM pour accéder à jconsole?

comment activer JMX sur un JVM pour accéder avec jconsole?

171
demandé sur Mauli 2009-05-13 13:02:12

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

237
répondu Mauli 2018-03-19 16:13:52

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:

Add Remote Host

puis clic droit sur la nouvelle connexion à distance de L'hôte et Add JMX Connection...

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.

34
répondu Joel B 2018-03-19 16:14:40

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.

9
répondu Thorbjørn Ravn Andersen 2009-05-13 16:48:09

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
7
répondu user3013578 2017-08-10 13:43:06

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)

6
répondu alex.pulver 2016-04-12 15:38:54

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 .

2
répondu Wasif 2012-05-12 10:22:42

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.

0
répondu cstroe 2017-03-23 10:43:55