Wie JMX auf meiner JVM für den Zugriff mit jconsole aktivieren?
-
21-08-2019 - |
Frage
Wie aktivieren JMX auf einer JVM für den Zugriff mit jconsole?
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
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:
dann mit dem rechten Maustaste auf die neue Remote Host-Verbindung und Add JMX Connection...
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
.