Come attivare JMX su una JVM per l'accesso con jconsole?
Come attivare JMX su una JVM per l'accesso con jconsole?
Risposte:
La documentazione pertinente è disponibile qui:
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
Avvia il tuo programma con i seguenti parametri:
-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
Ad esempio in questo modo:
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
non è necessariamente necessario ma senza di esso, non funziona su Ubuntu. L'errore sarebbe qualcosa del genere:
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)
vedi http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672
Fai anche attenzione a ciò-Dcom.sun.management.jmxremote.authenticate=false
che rende l'accesso disponibile a chiunque, ma se lo usi solo per tracciare JVM sul tuo computer locale, non importa.
Aggiornamento :
In alcuni casi non sono stato in grado di raggiungere il server. Questo è stato quindi risolto se ho impostato anche questo parametro:-Djava.rmi.server.hostname=127.0.0.1
com.sun.management.jmxremote
abbia il valore predefinito come true
. (Grazie Sun!) Per essere super chiaro, specialmente per quelli che non hanno familiarità con i nobili di JMX, io uso: com.sun.management.jmxremote=true
Ref: docs.oracle.com/javase/8/docs/technotes/guides/management/…
Dcom.sun.management.jmxremote.rmi.port=9011
e aprire nel firewall - ancora non riesco a connettermi con il firewall in uso. qualche idea? Ho perso qualcosa?
L'esecuzione in un contenitore Docker ha introdotto tutta una serie di problemi aggiuntivi per la connessione, quindi spero che questo aiuti qualcuno. Ho finito per aggiungere le seguenti opzioni che spiegherò di seguito:
-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
A differenza dell'uso locale di jconsole, devi pubblicizzare un IP diverso da quello che probabilmente vedrai all'interno del contenitore. Dovrai sostituirlo ${DOCKER_HOST_IP}
con l'IP (nome DNS) risolvibile esternamente dell'host Docker.
Porte JMX remote e RMI
Sembra che JMX richieda anche l'accesso a un'interfaccia di gestione remota ( jstat ) che utilizza una porta diversa per trasferire alcuni dati durante l'arbitrato della connessione. Non ho visto da nessuna parte immediatamente ovvio jconsole
impostare questo valore. Nell'articolo collegato il processo era:
jconsole
con la registrazione abilitatajconsole
tentato di utilizzareiptables
/ firewall
regole come necessario per consentire a quella porta di connettersiMentre funziona, non è certamente una soluzione automatizzabile. Ho optato per un aggiornamento da jconsole a VisualVM poiché ti consente di specificare esplicitamente la porta su cui jstatd
è in esecuzione. In VisualVM, aggiungi un nuovo host remoto e aggiornalo con valori correlati a quelli sopra specificati:
Quindi fare clic con il tasto destro del mouse sulla nuova connessione host remoto e Add JMX Connection...
Non dimenticare di selezionare la casella di controllo per Do not require SSL connection
. Spero che ciò ti consenta di connetterti.
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=[...]
è anche la chiave in caso di tunneling da JMX / RMI a SSH. Senza questi, gli oggetti remoti sono accessibili usando l'IP pubblico / main / ... del server usando una porta casuale, che non può essere inoltrata facilmente.
-Djava.rmi.server.hostname=0.0.0.0
DOCKER_HOST_IP
nessuna parte - ho appena usato localhost
e inoltrato le porte quando eseguivo l'immagine docker: -p 9998:9998, -p 9999:9999
ecc.
Nota, Java 6 nell'ultima incarnazione consente a jconsole di collegarsi a un processo in esecuzione anche dopo che è stato avviato senza incantesimi JMX.
Se questo è disponibile per te, considera anche jvisualvm in quanto fornisce una grande quantità di informazioni sui processi in esecuzione, incluso un profiler.
Sto usando WAS ND 7.0
La mia JVM necessita di tutti i seguenti argomenti per essere monitorata in 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
Su Linux, ho usato i seguenti parametri:
-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
e ho anche modificato in /etc/hosts
modo che il nome host si risolva nell'indirizzo host (192.168.0.x) anziché nell'indirizzo di loopback (127.0.0.1)
Esegui l'applicazione java con i seguenti parametri della riga di comando:
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
È importante utilizzare il parametro -Dcom.sun.management.jmxremote.ssl = false se non si desidera impostare certificati digitali sull'host jmx.
Se l'applicazione è stata avviata su un computer con indirizzo IP 192.168.0.1 , aprire jconsole , inserire 192.168.0.1:8855 nel campo Processo remoto e fare clic su Connetti .
-Dcom.sun.management.jmxremote.ssl=false
? Dovrebbe jconsole
mostrare un errore o semplicemente non riuscirà a connettersi in silenzio?
insieme ai seguenti parametri della riga di comando,
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
A volte nei server Linux, la connessione imx non riesce. questo perché, nell'host linux cloud, in / etc / hosts in modo che il nome host si risolva nell'indirizzo host.
il modo migliore per risolverlo è, eseguire il ping del particolare server Linux da un'altra macchina in rete e utilizzare quell'indirizzo IP host in
-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.
Ma non fare mai affidamento sull'indirizzo ip che ottieni dal server Linux usando ifconfig.me. l'ip che ci arriva è mascherato che è presente nel file host.
Innanzitutto è necessario verificare se il processo java è già in esecuzione con i parametri JMX. Fai questo:
ps -ef | grep java
Controlla il tuo processo java che devi monitorare. Se riesci a vedere il parametro jmx rmi Djmx.rmi.registry.port = xxxx allora usa la porta menzionata qui nel tuo java visualvm per connetterlo da remoto con la connessione jmx.
Se non è in esecuzione attraverso la porta jmx rmi, è necessario eseguire il processo java con i parametri di seguito indicati:
-Djmx.rmi.registry.port=1234 -Djmx.rmi.port=1235 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
Nota: i numeri di porta si basano sulla vostra scelta.
Ora puoi usare questa porta per la conezione jmx. Ecco il porto 1234
.
sudo lsof -i:1234
non sta mostrando nulla per me
Passaggio 1: eseguire l'applicazione utilizzando i seguenti parametri.
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Gli argomenti precedenti associano l'applicazione alla porta 9999.
Passaggio 2: avviare jconsole eseguendo il comando jconsole nel prompt dei comandi o nel terminale.
Seleziona 'Remote Process:' e inserisci l'URL come {IP_Address}: 9999 e fai clic sul pulsante Connetti per connetterti all'applicazione remota.
È possibile fare riferimento a questo collegamento per l'applicazione completa.
Ho avuto questo problema esatto e ho creato un progetto GitHub per testare e capire le impostazioni corrette .
Contiene un funzionamento Dockerfile
con script di supporto e un semplice docker-compose.yml
per test rapidi.