2009-05-13 12 views
153

Come attivare JMX su una JVM per l'accesso con jconsole?Come attivare JMX sulla mia JVM per l'accesso con jconsole?

+30

è allowd, e in realtà è solo un promemoria per me, perché dimentico sempre dove copiare i parametri e ora so dove lo trovo :-) – Mauli

+18

Stack Exchange ha sempre incoraggiato esplicitamente gli utenti a rispondere ai propri domande, vedere qui: http://stackoverflow.com/help/self-answer –

+10

Più di una volta ho cercato SO per qualcosa e ho trovato una risposta a una domanda ... da solo. E uno di quelli è stato chiesto anche da me. Questo è il motivo per cui è bene inserire le proprie risposte. Inoltre, pensa a tutte le altre persone che potrebbero aver incontrato il tuo problema, se rispondi alla tua domanda aiuterai anche loro. –

risposta

222

La relativa documentazione può essere trovato qui:

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html

avviare il programma con i seguenti parametri:

-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 

Per 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 richiesto ma senza di esso, non funziona su Ubuntu. L'errore sarebbe qualcosa di simile questo:

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) 

vedere http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672

anche essere attenti con -Dcom.sun.management.jmxremote.authenticate=false che rende l'accesso disponibile per chiunque, ma se si utilizzano esclusivamente per monitorare la JVM sul tua macchina locale non importa.

Aggiornamento:

In alcuni casi non è stato in grado di raggiungere il server. Questo è stato quindi corretto se ho impostato anche questo parametro: -Djava.rmi.server.hostname=127.0.0.1

+8

The -Dcom.sun.management.jmxremote.local.only = falso è necessario anche su Centos – LenW

+0

Nit pick: è strano per me che 'com.sun.management.jmxremote' abbia il valore predefinito' vero'. (Grazie a Sun!) Per essere molto chiari, specialmente per quelli meno familiari con JMX nobs, io uso: 'com.sun.management.jmxremote = true' Ref: http://docs.oracle.com/javase/8/ docs/technotes/guides/management/agent.html – kevinarpe

+0

"-Djava.rmi.server.hostname" ha funzionato come un incantesimo per me! –

9

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, considerare anche jvisualvm in quanto fornisce una grande quantità di informazioni sui processi in esecuzione, tra cui un profiler.

+3

Funziona solo se si esegue jconsole sullo stesso host della JVM che si sta tentando di monitorare. – Gray

+1

@ Thorbjorn Se avvio il mio programma java senza parametri e cerco di connettermi con jconsole, vedo nel mio programma nell'elenco ma quando provo a collegarlo fallisce. Penso che sia a causa della mancanza di certificati SSL. Volevo solo vedere la demo, quindi ho dovuto usare i parametri specificati nella risposta da user3013578 e ha funzionato per me (JDK 1.7, Windows 8.1, 64 bit). –

+2

L'API di collegamento richiede a jconsole di avere la stessa JVM a 32/64 bit del programma avviato su alcune piattaforme. –

2

Eseguire 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 

E 'importante utilizzare il -Dcom.sun.management.jmxremote.ssl = false parametro se non si vuole imposta i certificati digitali sull'host jmx.

se hai iniziato la tua applicazione su una macchina con indirizzo IP 192.168.0.1 , aperto JConsole, messo 192.168.0.1:8855 nel remoto campo processo, e fare clic su Connetti .

+0

Qual è il comportamento previsto se si dimentica '-Dcom.sun.management.jmxremote.ssl = false'? Dovrebbe 'jconsole' mostrare un errore, o semplicemente non riuscirebbe a connettersi? – amacleod

7

Sto usando WAS ND 7.0

mio JVM bisogno di tutti i seguenti argomenti da monitorare 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 
+0

Sì, la tua risposta ha funzionato per me (JDK 1.7, Windows 8.1 64 bit) –

6

Su Linux, ho usato i seguenti params:

-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 anche io a cura /etc/hosts in modo che si risolve hostname all'indirizzo host (192.168.0.x) anziché all'indirizzo di loopback (127.0.0.1)

19

In esecuzione in un contenitore Docker è stata introdotta una grande quantità di addit problemi ionali per la connessione, quindi spero che questo aiuti qualcuno. Ho finito necessaria per aggiungere le seguenti opzioni che spiegherò qui 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 di JConsole a livello locale, è necessario promuovere un IP diverso da quello che probabilmente vedrete dall'interno del contenitore. Dovrai sostituire ${DOCKER_HOST_IP} con l'IP risolvibile esternamente (Nome DNS) dell'host Docker.

JMX Remote & RMI porte

Sembra JMX richiede anche accesso ad un'interfaccia di gestione remota (jstat) che uses a different port per trasferire alcuni dati quando arbitrare la connessione. Non ho visto da nessuna parte immediatamente ovvio in jconsole per impostare questo valore. Nell'articolo collegato il processo è stato:

  • prova e collegare da jconsole con la registrazione attivata
  • Fail
  • figura quale porta jconsole tentato di utilizzare
  • Uso iptables/firewall regole necessarie per consentire che porta per connettersi

Mentre funziona, non è certamente una soluzione automatizzabile. Ho optato per un aggiornamento da jconsole a VisualVM poiché consente di specificare esplicitamente la porta su cui è in esecuzione jstatd. In VisualVM, aggiungere un nuovo host remoto e aggiornarlo con i valori che correlano a quelli di cui sopra:

Add Remote Host

Quindi fare clic destro sulla nuova connessione host remoto e Add JMX Connection...

Add JMX Connection

Non dimenticare di selezionare la casella di controllo per Do not require SSL connection. Spero che ciò ti permetta di connetterti.

+0

Grazie per la tua esauriente spiegazione, mi ha risparmiato ore di tempo. –