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=falsenon è 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.jmxremoteabbia 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=trueRef: docs.oracle.com/javase/8/docs/technotes/guides/management/…
Dcom.sun.management.jmxremote.rmi.port=9011e 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 jconsoleimpostare questo valore. Nell'articolo collegato il processo era:
jconsolecon la registrazione abilitatajconsoletentato di utilizzareiptables/ firewallregole 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_IPnessuna parte - ho appena usato localhoste inoltrato le porte quando eseguivo l'immagine docker: -p 9998:9998, -p 9999:9999ecc.
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/hostsmodo 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 jconsolemostrare 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:1234non 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 Dockerfilecon script di supporto e un semplice docker-compose.ymlper test rapidi.