Frage

Wie aktivieren JMX auf einer JVM für den Zugriff mit jconsole?

War es hilfreich?

Lösung

Die entsprechende Dokumentation finden Sie hier:

http://java.sun.com/ JavaSE / 6 / docs / technotes / guides / Management / agent.html

Starten Sie Ihr Programm mit folgenden Parametern:

-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

Zum Beispiel wie folgt aus:

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 ist nicht unbedingt erforderlich aber ohne sie, funktioniert es nicht auf Ubuntu. Der Fehler wäre so etwas wie folgt aus:

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)

finden Sie unter http://bugs.sun.com/bugdatabase/view_bug.do ? bug_id = 6754672

Seien Sie auch vorsichtig mit -Dcom.sun.management.jmxremote.authenticate=false die Zugang zur Verfügung stellt, für jedermann, aber wenn Sie es nur verwenden, um die JVM zu verfolgen auf Ihre lokale Maschine ist es egal.

Aktualisieren :

In einigen Fällen war ich nicht in der Lage, den Server zu erreichen. Dies wurde dann festgelegt, wenn ich diesen Parameter auch: -Djava.rmi.server.hostname=127.0.0.1

Andere Tipps

eine ganze Reihe von zusätzlichen Problemen

in einem Behälter eingebracht Docker Rennen so hoffentlich hilft dies jemanden zu verbinden. Ich landete notwendig, um die folgenden Optionen hinzufügen, die ich weiter unten erklären werde:

-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

Im Gegensatz zu lokal mit jconsole, müssen Sie eine andere IP-werben, als Sie wahrscheinlich aus dem Behälter sehen werden. Sie werden ${DOCKER_HOST_IP} mit dem extern auflösbaren IP (DNS-Name) Ihres Docker Host ersetzen müssen.

JMX Fern & RMI Ports

Es sieht aus wie JMX erfordert auch Zugriff auf eine Remote-Management-Schnittstelle ( jstat ), die a href <=" https://johnpfield.wordpress.com/2014/01/29/how-to-monitor-a-remote-jvm-running-on-rhel/“ rel = „noreferrer“> verwendet einen anderen Port einige Daten zu übertragen, wenn die Verbindung Schlichtung. Ich habe nicht überall sofort offensichtlich in jconsole sehen diesen Wert einzustellen. Im verlinkten Artikel der Prozess war:

  • Versuchen und von jconsole Verbindung mit Protokollierung aktiviert
  • Ausfallen
  • Herauszufinden, welcher Port jconsole zu verwenden versucht
  • Verwenden Sie iptables / firewall Regeln wie nötig, dass der Port eine Verbindung herstellen

Während das funktioniert, ist es sicherlich nicht eine automatisierbare Lösung. Ich entschied mich für ein Upgrade von jconsole VisualVM , da es Ihnen lassen sie explizit den Port angeben, auf dem jstatd läuft. In VisualVM, eine neue Remote-Host hinzufügen und es mit Werten aktualisieren, die die korrelieren oben angegeben:

 Add Remote Host

dann mit dem rechten Maustaste auf die neue Remote Host-Verbindung und Add JMX Connection...

 Add JMX-Verbindung

Vergessen Sie nicht das Kontrollkästchen für Do not require SSL connection zu überprüfen. Wir hoffen, dass sollten Sie eine Verbindung herstellen.

Beachten Sie, Java 6 in der neuesten Inkarnation ermöglicht jconsole sich sogar an einen laufenden Prozess zu befestigen, nachdem es ohne JMX Beschwörungen gestartet wurde.

Wenn das Ihnen zur Verfügung steht, auch prüfen, jvisualvm wie es eine Fülle von Informationen bietet Prozesse ausgeführt werden, einschließlich einem Profiler.

Ich bin mit WAS ND 7.0

Meine JVM müssen alle folgenden Argumente in JConsole überwacht werden

    -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

Unter Linux, habe ich die folgenden params:

-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

und auch bearbeiten ich /etc/hosts so dass der Hostname an die Host-Adresse aufgelöst wird (192.168.0.x) und nicht die Loopback-Adresse (127.0.0.1)

Führen Sie Ihre Java-Anwendung mit den folgenden Befehlszeilenparameter:

-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Es ist wichtig, die -Dcom.sun.management.jmxremote.ssl = false Parameter zu verwenden, wenn Sie Setup nicht wollen, digitale Zertifikate auf der JMX-Host.

Wenn Sie begann Ihre Anwendung auf einer Maschine mit IP-Adresse 192.168.0.1 , öffnen Sie jconsole , setzen Sie 192.168.0.1:8855 in der Remote Process Feld, und klicken Sie auf Connect .

zusammen mit folgenden Kommandozeilenparameter,

-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Manchmal in den Linux-Servern, imx Verbindung bekommt nicht gelungen. das liegt daran, in Cloud Linux-Host, in / etc / Hosts, so dass die Host-Namen an die Host-Adresse aufgelöst wird.

der beste Weg, um es zu beheben ist, ping den spezielle Linux-Server von anderer Maschine in Netzwerk und verwenden Sie diese Host-IP-Adresse in dem

-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.

Aber verlassen nie auf der IP-Adresse, die Sie von Linux-Server erhalten mit ifconfig.me. die IP, die Sie bekommen dort maskiert ein, die in der Host-Datei vorhanden ist.

Ich hatte genau dieses Problem und ein GitHub Projekt zum Testen erstellt und herauszufinden, die richtigen Einstellungen .

Es enthält eine Arbeits Dockerfile mit Unterstützung Skripten und eine einfache docker-compose.yml für einen schnellen Test.

Zuerst müssen Sie überprüfen, ob Ihr Java-Prozess bereits mit JMX Parametern ausgeführt wird. Tun Sie dies:

ps -ef | grep java

Überprüfen Sie Ihre Java-Prozess, den Sie überwachen müssen. Wenn Sie JMX rmi Parameter Djmx.rmi.registry.port = xxxx verwenden Sie dann den Port erwähnt hier in Ihre Java-VisualVM es eine Remote-Verbindung unter JMX-Verbindung sehen.

Wenn es nicht JMX rmi Port läuft durch, dann müssen Sie mit unten genannten Parameter Ihr Java-Prozess auszuführen:

-Djmx.rmi.registry.port=1234 -Djmx.rmi.port=1235 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

. Hinweis: Portnummern werden auf der Grundlage Ihrer Wahl

Jetzt können Sie diesen Port für JMX coneection verwenden. Hier ist es Port 1234.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top