Jak aktywować JMX na JVM, aby uzyskać dostęp za pomocą jconsole?
Jak aktywować JMX na JVM, aby uzyskać dostęp za pomocą jconsole?
Odpowiedzi:
Odpowiednia dokumentacja znajduje się tutaj:
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
Uruchom program z następującymi parametrami:
-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
Na przykład tak:
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
nie jest koniecznie wymagany, ale bez niego nie działa na Ubuntu. Błąd byłby mniej więcej taki:
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)
patrz http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672
Uważaj również, dzięki-Dcom.sun.management.jmxremote.authenticate=false
czemu dostęp jest dostępny dla każdego, ale jeśli używasz go tylko do śledzenia JVM na komputerze lokalnym, nie ma to znaczenia.
Aktualizacja :
W niektórych przypadkach nie mogłem połączyć się z serwerem. Zostało to naprawione, jeśli ustawię również ten parametr:-Djava.rmi.server.hostname=127.0.0.1
com.sun.management.jmxremote
ma domyślną wartość as true
. (Dziękuję Sun!) Aby być bardzo jasnym, szczególnie dla osób mniej zaznajomionych z numerami JMX, używam: com.sun.management.jmxremote=true
Ref: docs.oracle.com/javase/8/docs/technotes/guides/management/…
Dcom.sun.management.jmxremote.rmi.port=9011
i otworzyć w zaporze ogniowej - nadal nie mogę się połączyć z uruchomioną zaporą ogniową. jakieś pomysły? Czy coś przeoczyłem?
Praca w kontenerze Docker wprowadziła całą masę dodatkowych problemów z połączeniem, więc mam nadzieję, że to komuś pomoże. W końcu musiałem dodać następujące opcje, które wyjaśnię poniżej:
-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
W przeciwieństwie do używania jconsole lokalnie, musisz zareklamować inny adres IP, niż prawdopodobnie zobaczysz w kontenerze. Musisz zastąpić ${DOCKER_HOST_IP}
zewnętrznie rozpoznawalnym adresem IP (nazwa DNS) hosta Docker.
Porty JMX Remote i RMI
Wygląda na to, że JMX wymaga również dostępu do interfejsu zdalnego zarządzania ( jstat ), który używa innego portu do przesyłania niektórych danych podczas arbitrażu połączenia. Nigdzie nie widziałem od razu oczywistego jconsole
ustawienia tej wartości. W powiązanym artykule proces był następujący:
jconsole
z włączonym rejestrowaniemjconsole
próbował użyćiptables
/ firewall
rules, aby zezwolić na połączenie tego portuChociaż to działa, z pewnością nie jest to rozwiązanie automatyczne. Zdecydowałem się na aktualizację z jconsole do VisualVM, ponieważ pozwala ci to wyraźnie określić port, na którym jstatd
działa. W VisualVM dodaj nowy host zdalny i zaktualizuj go o wartości, które korelują z wartościami podanymi powyżej:
Następnie kliknij prawym przyciskiem myszy nowe Zdalne połączenie hosta i Add JMX Connection...
Nie zapomnij zaznaczyć pola wyboru dla Do not require SSL connection
. Mam nadzieję, że powinno to umożliwić połączenie.
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=[...]
jest również kluczem w przypadku tunelowania JMX / RMI przez SSH. Bez nich zdalne obiekty są dostępne przy użyciu publicznego / głównego / ... adresu IP serwera przy użyciu losowego portu, którego nie można łatwo przekazać dalej.
-Djava.rmi.server.hostname=0.0.0.0
DOCKER_HOST_IP
Nigdzie nie musiałem używać - po prostu użyłem localhost
i przesłałem porty podczas uruchamiania obrazu dokera: -p 9998:9998, -p 9999:9999
itp.
Uwaga: Java 6 w najnowszym wcieleniu pozwala jconsole na dołączenie się do uruchomionego procesu nawet po jego uruchomieniu bez inkantacji JMX.
Jeśli jest to dla Ciebie dostępne, rozważ także jvisualvm, ponieważ zapewnia on wiele informacji na temat uruchomionych procesów, w tym profilera.
Używam WAS ND 7.0
Moja JVM potrzebuje wszystkich poniższych argumentów do monitorowania w 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
W systemie Linux użyłem następujących parametrów:
-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
a także edytowałem /etc/hosts
tak, aby nazwa hosta była tłumaczona na adres hosta (192.168.0.x), a nie na adres zwrotny (127.0.0.1)
Uruchom aplikację Java z następującymi parametrami wiersza poleceń:
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Ważne jest, aby użyć parametru -Dcom.sun.management.jmxremote.ssl = false , jeśli nie chcesz konfigurować certyfikatów cyfrowych na hoście jmx.
Jeśli aplikacja została uruchomiona na komputerze o adresie IP 192.168.0.1 , otwórz jconsole , wpisz 192.168.0.1:8855 w polu Zdalny proces i kliknij Połącz .
-Dcom.sun.management.jmxremote.ssl=false
? Czy powinien jconsole
wyświetlać się błąd, czy po prostu po prostu nie może się połączyć?
wraz z poniższymi parametrami wiersza poleceń,
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Czasami na serwerach Linux nie udaje się połączenie IMX. to jest dlatego, że w chmurze Linux, w / etc / hosts, tak że nazwa hosta jest tłumaczona na adres hosta.
najlepszym sposobem, aby to naprawić, pinguj konkretny serwer linux z innego komputera w sieci i użyj tego adresu IP hosta w
-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.
Ale nigdy nie polegaj na adresie iPada, który otrzymujesz z serwera Linux przy użyciu ifconfig.me. otrzymany adres IP jest zamaskowany i znajduje się w pliku hosta.
Najpierw musisz sprawdzić, czy proces Java jest już uruchomiony z parametrami JMX. Zrób to:
ps -ef | grep java
Sprawdź proces Java, który musisz monitorować. Jeśli widzisz parametr jmx rmi Djmx.rmi.registry.port = xxxx, użyj portu wymienionego tutaj w JavaVideo VVM, aby połączyć go zdalnie pod połączeniem JMX.
Jeśli nie działa przez port rmi jmx, musisz uruchomić proces Java z poniższymi parametrami:
-Djmx.rmi.registry.port=1234 -Djmx.rmi.port=1235 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
Uwaga: numery portów zależą od twojego wyboru.
Teraz możesz użyć tego portu do połączenia jmx. Oto port 1234
.
sudo lsof -i:1234
nic mi nie pokazuje
Krok 1: Uruchom aplikację, używając następujących parametrów.
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Powyższe argumenty wiążą aplikację z portem 9999.
Krok 2: Uruchom jconsole, wykonując polecenie jconsole w wierszu polecenia lub terminalu.
Wybierz „Remote Process:” i wprowadź adres URL jako {IP_Address}: 9999 i kliknij przycisk Connect, aby połączyć się ze zdalną aplikacją.
Możesz skorzystać z tego linku, aby uzyskać kompletną aplikację.
Miałem dokładnie ten problem i stworzyłem projekt GitHub w celu przetestowania i znalezienia właściwych ustawień .
Zawiera pracę Dockerfile
ze skryptami pomocniczymi i prosty docker-compose.yml
do szybkiego testowania.