Ottenere i parametri di una JVM in esecuzione


90

C'è un modo per ottenere i parametri di una JVM in esecuzione? Esiste uno strumento a riga di comando come jstat che prende come input il pid della JVM e restituisce i suoi parametri di partenza? Sono particolarmente interessato ai valori -Xmx e -Xms forniti all'avvio della JVM. Grazie.

Modifica : per chiarire i miei vincoli. La JVM che vorremmo controllare sia in esecuzione su un server di produzione. Ecco perché preferiamo il minimo disturbo. Siamo in grado di monitorare la JVM utilizzando jstat, quindi speriamo che esista una soluzione semplice simile per accedere ai parametri.

Modifica : abbiamo anche provato a ottenere i parametri usando jvisualvm. Ma per connetterci a una jvm remota, dobbiamo eseguire jstatd e modificare le impostazioni di sicurezza della JVM, che abbiamo trovato molto dirompente e rischiosa su un server di produzione.


Puoi trovare uno strumento lì: JDK Tools and Utilities
Guillaume Husta

Risposte:


145

Puoi usare jps come

jps -lvm

stampa qualcosa di simile

4050 com.intellij.idea.Main -Xms128m -Xmx512m -XX:MaxPermSize=250m -ea -Xbootclasspath/a:../lib/boot.jar -Djb.restart.code=88
4667 sun.tools.jps.Jps -lvm -Dapplication.home=/opt/java/jdk1.6.0_22 -Xms8m

6
Funziona come un fascino. Ho anche scoperto lo strumento jinfo nel jdk che ha una funzione simile
HH

2
Si noti che l'output di jps -lvmpotrebbe essere fuorviante. Controlla sempre con jinfo o un altro strumento. Il problema può essere se "-XX" viene passato come il normale argomento del programma e ignorato da JVM. Questo è il caso se usi al java -jar my.jar -Xmx3gposto dijava -Xmx3g -jar my.jar
Juraj Martinka

36

Sto aggiungendo questa nuova risposta perché come da documentazione JDK8 jcmd è l'approccio suggerito ora.

Si consiglia di utilizzare l'utilità più recente, jcmd invece delle precedenti utilità jstack, jinfo e jmap per una diagnostica avanzata e un sovraccarico delle prestazioni ridotto.

Di seguito sono riportati i comandi per ottenere le proprietà / flag che desideri.

jcmd pid VM.system_properties
jcmd pid VM.flags

Abbiamo bisogno di pid, per questo uso jcmd -l, come sotto

username@users-Air:~/javacode$ jcmd -l 
11441 Test 
6294 Test 
29197 jdk.jcmd/sun.tools.jcmd.JCmd -l 

Ora è il momento di usare questi pid per ottenere le proprietà / flag che desideri

Comando: jcmd 11441 VM.system_properties

11441:
#Tue Oct 17 12:44:50 IST 2017
gopherProxySet=false
awt.toolkit=sun.lwawt.macosx.LWCToolkit
file.encoding.pkg=sun.io
java.specification.version=9
sun.cpu.isalist=
sun.jnu.encoding=UTF-8
java.class.path=.
java.vm.vendor=Oracle Corporation
sun.arch.data.model=64
java.vendor.url=http\://java.oracle.com/
user.timezone=Asia/Kolkata
java.vm.specification.version=9
os.name=Mac OS X
sun.java.launcher=SUN_STANDARD
user.country=US
sun.boot.library.path=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/lib
sun.java.command=Test
http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
jdk.debug=release
sun.cpu.endian=little
user.home=/Users/XXXX
user.language=en
java.specification.vendor=Oracle Corporation
java.home=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
file.separator=/
java.vm.compressedOopsMode=Zero based
line.separator=\n
java.specification.name=Java Platform API Specification
java.vm.specification.vendor=Oracle Corporation
java.awt.graphicsenv=sun.awt.CGraphicsEnvironment
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
java.runtime.version=9+181
user.name=XXXX
path.separator=\:
os.version=10.12.6
java.runtime.name=Java(TM) SE Runtime Environment
file.encoding=UTF-8
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
java.vendor.url.bug=http\://bugreport.java.com/bugreport/
java.io.tmpdir=/var/folders/dm/gd6lc90d0hg220lzw_m7krr00000gn/T/
java.version=9
user.dir=/Users/XXXX/javacode
os.arch=x86_64
java.vm.specification.name=Java Virtual Machine Specification
java.awt.printerjob=sun.lwawt.macosx.CPrinterJob
sun.os.patch.level=unknown
MyParam=2
java.library.path=/Users/XXXX/Library/Java/Extensions\:/Library/Java/Extensions\:/Network/Library/Java/Extensions\:/System/Library/Java/Extensions\:/usr/lib/java\:.
java.vm.info=mixed mode
java.vendor=Oracle Corporation
java.vm.version=9+181
sun.io.unicode.encoding=UnicodeBig
java.class.version=53.0
socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16

Comando: jcmd 11441 VM.flags output:

11441:
-XX:CICompilerCount=3 -XX:ConcGCThreads=1 -XX:G1ConcRefinementThreads=4 -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=67108864 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=643825664 -XX:MinHeapDeltaBytes=1048576 -XX:NonNMethodCodeHeapSize=5830092 -XX:NonProfiledCodeHeapSize=122914074 -XX:ProfiledCodeHeapSize=122914074 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:-UseAOT -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 

Per ulteriori istruzioni sull'utilizzo di jcmd, vedere il mio post sul blog


Impossibile trovare processi corrispondenti: "pid"
Ch Vas

1
pid dovrebbe essere sostituito con l'id del processo java, il sistema operativo Linux generalmente lo si ottiene con “ps -ef | grep jdk ", se vedi più processi da questo, fai una nuova domanda o prova a cercarlo su Google
Vipin


21

In alternativa, puoi usare jinfo

jinfo -flags <vmid> 
jinfo -sysprops <vmid>

3
Questa utility non è supportata e potrebbe non essere disponibile nelle versioni future di JDK.
GoYun.Info

-flagsl'opzione non esiste nella VM server OpenJDK a 64 bit (build 1.8.0_111-internal-alpine-r0-b14) ( java:8u111-jdk-alpineimmagine Docker corrente )
Anthony O.

Ho scritto questa risposta pensando a Java 6/7. Oltre a ciò jinfo non è affidabile, ma flagsfunziona con l'immagine java Docker ufficiale basata su Debian Jessie docker run --rm -it java:8u111-jdk java -version && jinfo -h
Jarek Przygódzki

15

Se puoi farlo in java, prova:

RuntimeMXBean

ManagementFactory

Esempio:

RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> jvmArgs = runtimeMXBean.getInputArguments();
for (String arg : jvmArgs) {
    System.out.println(arg);
}

1
Fornirà valori solo se è stato passato, quindi nessuna impostazione predefinita.
Behe

8

JConsole può farlo. Inoltre è possibile utilizzare un potente strumento jvisualVM, anch'esso incluso in JDK dalla 1.6.0.8.


3

Su linux, puoi eseguire questo comando e vedere il risultato:

ps aux | grep "java"

La mia azienda utilizza Red Hat Linux e ho un accesso molto limitato al sistema. ps aux | Il comando grep "java" elenca tutti i comandi java con i loro argomenti jvm e possiamo anche grep l'esatto argomento jvm se necessario. Questo è davvero utile nel caso in cui altri strumenti come jps, jcmd ecc. Non siano disponibili / accessibili.
AGan

1

Windows 10 o Windows Server 2016 forniscono tali informazioni nel loro task manager standard. Un caso raro per la produzione, ma se la JVM di destinazione è in esecuzione su Windows, il modo più semplice per vedere i suoi parametri è premere Ctrl + Alt + Canc, scegliere la scheda Processi e aggiungere la colonna Riga di comando (facendo clic con il pulsante destro del mouse su qualsiasi intestazione di colonna esistente).


1

Se sei interessato a ottenere i parametri JVM di un processo java in esecuzione, esegui semplicemente kill -3 java-pid. Otterrai un file core dump in cui puoi trovare i parametri jvm utilizzati durante l'avvio dell'applicazione java.


0

È possibile utilizzare il comando JConsole (o qualsiasi altro client JMX) per accedere a tali informazioni.


0

Questa tecnica si applica a qualsiasi applicazione Java in esecuzione in locale o in remoto.

  1. Avvia la tua applicazione java.
  2. Esegui JVisualVM trovato nel tuo JDK (come C: \ Program Files \ Java \ jdk1.8.0_05 \ bin \ jvisualvm.exe).
  3. Quando questo utile strumento si avvia, guarda l'elenco delle applicazioni Java in esecuzione sotto il nodo dell'albero "Locale".
  4. Fare doppio clic su [la tua applicazione] (pid [n]).
  5. Sul lato destro ci sarà il contenuto dell'ispezione nella scheda dell'applicazione. Al centro della scheda Panoramica vedrai gli argomenti JVM per l'applicazione.

jvisualvm può essere trovato in qualsiasi JDK a partire dall'aggiornamento 7 di JDK 6. Il tutorial video su jvisualvm è qui.


OP ha dichiarato esplicitamente che jvisualvm non era un'opzione.
Olivier Gérardin

0

_JAVA_OPTIONS è una variabile env che può essere espansa.

echo $_JAVA_OPTIONS
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.