Wie aktiviert man JMX auf einer JVM für den Zugriff mit jconsole?
Die Option -Dcom.sun.management.jmxremote.local.only=false wird jetzt auch unter Centos benötigt
Wie aktiviert man JMX auf einer JVM für den Zugriff mit jconsole?
Die entsprechende Dokumentation finden Sie hier:
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
Starten Sie Ihr Programm mit den folgenden Parametern:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.rmi.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Zum Beispiel so:
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 unter Ubuntu nicht. Die Fehlermeldung würde etwa so aussehen so:
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)
siehe http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672
Seien Sie auch vorsichtig mit -Dcom.sun.management.jmxremote.authenticate=false
die für jeden zugänglich ist, aber wenn Sie es nur benutzen, um die JVM auf Ihrem Ihrem lokalen Rechner zu verfolgen, spielt das keine Rolle.
更新情報 :
In einigen Fällen war es mir nicht möglich, den Server zu erreichen. Dies wurde dann behoben, wenn ich auch diesen Parameter setzte: -Djava.rmi.server.hostname=127.0.0.1
Die Option -Dcom.sun.management.jmxremote.local.only=false wird jetzt auch unter Centos benötigt
Kleinigkeit: Ich finde es seltsam, dass com.sun.management.jmxremote
hat den Standardwert true
. (Danke Sun!) Um es ganz klar zu sagen, insbesondere für diejenigen, die mit JMX-Nobs weniger vertraut sind, verwende ich: com.sun.management.jmxremote=true
Ref: docs.oracle.com/javase/8/docs/technotes/guides/management/
Die Ausführung in einem Docker-Container brachte eine ganze Reihe zusätzlicher Probleme für die Verbindung mit sich, daher hoffe ich, dass dies jemandem hilft. Am Ende musste ich die folgenden Optionen hinzufügen, die ich weiter unten erläutern 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
Anders als bei der lokalen Verwendung von jconsole müssen Sie eine andere IP-Adresse angeben, als Sie wahrscheinlich innerhalb des Containers sehen werden. Sie müssen die ${DOCKER_HOST_IP}
mit der von außen auflösbaren IP (DNS-Name) Ihres Docker-Hosts.
JMX-Fernzugriff und RMI-Anschlüsse
Es sieht so aus, als ob JMX auch den Zugang zu einer Remote-Management-Schnittstelle ( jstat ), dass verwendet einen anderen Port bei der Vermittlung der Verbindung einige Daten zu übertragen. Ich habe nirgends einen offensichtlichen Hinweis in jconsole
um diesen Wert festzulegen. In dem verlinkten Artikel war der Prozess:
jconsole
mit aktivierter Protokollierungjconsole
versucht zu verwendeniptables
/ firewall
Regeln, die erforderlich sind, damit dieser Anschluss eine Verbindung herstellen kannDas funktioniert zwar, ist aber sicher keine automatisierbare Lösung. Ich habe mich für ein Upgrade von jconsole auf VisualVM da es Ihnen die Möglichkeit gibt, explizit den Port anzugeben, auf dem jstatd
läuft. Fügen Sie in VisualVM einen neuen Remote-Host hinzu und aktualisieren Sie ihn mit Werten, die mit den oben angegebenen übereinstimmen:
Klicken Sie dann mit der rechten Maustaste auf die neue Remote-Host-Verbindung und Add JMX Connection...
Vergessen Sie nicht, das Kontrollkästchen zu aktivieren Do not require SSL connection
. Damit sollten Sie hoffentlich eine Verbindung herstellen können.
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=[...]
ist auch der Schlüssel im Falle des Tunnelns von JMX/RMI über SSH. Ohne diese wird auf entfernte Objekte über die öffentliche/main/... IP des Servers über einen zufälligen Port zugegriffen, der nicht einfach weitergeleitet werden kann.
Ich kann bestätigen, dass Sie wirklich die externe IP des Containers verwenden müssen. Zum Beispiel funktioniert es nicht mit -Djava.rmi.server.hostname=0.0.0.0
Ich brauchte nicht zu benutzen DOCKER_HOST_IP
irgendwo - ich habe einfach localhost
und leitete die Ports beim Ausführen des Docker-Images weiter: -p 9998:9998, -p 9999:9999
usw.
In der neuesten Version von Java 6 kann sich jconsole an einen laufenden Prozess anhängen, auch wenn dieser ohne JMX-Befehle gestartet wurde.
Wenn Ihnen das zur Verfügung steht, sollten Sie auch jvisualvm in Betracht ziehen, da es eine Fülle von Informationen über laufende Prozesse, einschließlich eines Profilers, bietet.
Dies funktioniert nur, wenn Sie jconsole auf demselben Host ausführen wie die JVM, die Sie überwachen wollen.
@ Thorbjorn Wenn ich mein Java-Programm ohne Parameter starte und versuche, eine Verbindung mit jconsole herzustellen, sehe ich mein Programm in der Liste, aber wenn ich versuche, eine Verbindung herzustellen, schlägt es fehl. Ich denke, es liegt an den fehlenden SSL-Zertifikaten. Ich wollte nur die Demo sehen, daher musste ich die in der Antwort von user3013578 angegebenen Parameter verwenden und es funktionierte bei mir (JDK 1.7, Windows 8.1, 64 bit).
Für die Attach-API muss jconsole auf einigen Plattformen die gleiche 32/64-Bit-JVM wie das gestartete Programm haben.
Ich verwende WAS ND 7.0
Meine JVM benötigt alle folgenden Argumente, um in JConsole überwacht zu 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 Parameter verwendet:
-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 ich habe auch bearbeitet /etc/hosts
damit der Hostname in die Host-Adresse (192.168.0.x) und nicht in die Loopback-Adresse (127.0.0.1) aufgelöst wird
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
33 Stimmen
Es ist erlaubt, und eigentlich ist es nur eine Erinnerung für mich, weil ich immer vergesse, woher ich die Parameter kopiere, und jetzt weiß ich, wo ich sie finde :-)
21 Stimmen
Stack Exchange hat die Benutzer immer ausdrücklich dazu ermutigt, ihre eigenen Fragen zu beantworten, siehe hier: stackoverflow.com/help/self-answer
11 Stimmen
Mehr als einmal habe ich SO nach etwas gesucht und eine Antwort auf eine Frage gefunden... von mir selbst. Und eine dieser Fragen wurde auch von mir gestellt. Deshalb ist es gut, wenn man seine eigenen Antworten einstellt. Denken Sie auch an all die anderen Leute, die vielleicht auf Ihr Problem gestoßen sind, wenn Sie Ihre Frage beantworten, werden Sie auch ihnen helfen.
2 Stimmen
Das aktualisierte Dokument für Java 8 lautet aquí
0 Stimmen
@Mauren: Können Sie einen Hinweis auf Ihre geschlossene Frage geben, die Sie selbst beantwortet haben? Es könnte sich lohnen, darüber auf Meta zu diskutieren.
0 Stimmen
@kevinarpe Es tut mir leid. Das ist schon lange her und ich bin nicht mehr in der Lage, Ihnen den Link und den Inhalt zur Verfügung zu stellen.
0 Stimmen
Die Frage sollte erwähnen, dass Sie genau das gleiche Problem haben können, wenn jvisualvm beim Versuch, CPU-Sampling zu starten, die Meldung "Failed to create JMX connection to target application" ausgibt.