256 Stimmen

Wie aktiviere ich JMX auf meiner JVM für den Zugriff mit jconsole?

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

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.

331voto

Mauli Punkte 16493

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

11 Stimmen

Die Option -Dcom.sun.management.jmxremote.local.only=false wird jetzt auch unter Centos benötigt

1 Stimmen

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/

2 Stimmen

"-Djava.rmi.server.hostname" hat bei mir wunderbar funktioniert!

81voto

Joel B Punkte 10265

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:

  • Versuchen Sie eine Verbindung von jconsole mit aktivierter Protokollierung
  • Fail
  • Finden Sie heraus, welcher Anschluss jconsole versucht zu verwenden
  • 使用方法 iptables / firewall Regeln, die erforderlich sind, damit dieser Anschluss eine Verbindung herstellen kann

Das 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:

Add Remote Host

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

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.

1 Stimmen

-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.

1 Stimmen

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

1 Stimmen

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.

10voto

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.

5 Stimmen

Dies funktioniert nur, wenn Sie jconsole auf demselben Host ausführen wie die JVM, die Sie überwachen wollen.

1 Stimmen

@ 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).

2 Stimmen

Für die Attach-API muss jconsole auf einigen Plattformen die gleiche 32/64-Bit-JVM wie das gestartete Programm haben.

7voto

user3013578 Punkte 71

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

0 Stimmen

Ja, Ihre Antwort hat bei mir funktioniert (JDK 1.7, Windows 8.1 64 bit)

6voto

alex.pulver Punkte 2053

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.com

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.

Powered by:

X