134 votes

Obtenir les paramètres d'une JVM en cours d'exécution

Existe-t-il un moyen d'obtenir les paramètres d'une JVM en cours d'exécution ?

Existe-t-il un outil en ligne de commande, tel que jstat, qui prend en entrée les données suivantes PID de la JVM et renvoie ses paramètres de départ ? Je suis particulièrement intéressé par la fonction -Xmx y -Xms qui ont été données au démarrage de la JVM.

Pour clarifier mes contraintes pour la JVM, nous voudrions vérifier si elle tourne sur un serveur de production. C'est pourquoi nous préférons une perturbation minimale. Nous sommes capables de surveiller la JVM à l'aide de jstat, et nous espérons donc qu'il existe une solution simple similaire pour accéder aux paramètres.

Nous avons également essayé d'obtenir les paramètres à l'aide de jvisualvm. Mais pour se connecter à une JVM distante, il faut lancer jstatd et modifier les paramètres de sécurité de la JVM, ce qui nous a semblé très perturbant et risqué sur un serveur de production.

189voto

Peter Lawrey Points 229686

Vous pouvez utiliser jps comme :

jps -lvm

Il s'imprime quelque chose comme :

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

69voto

Vipin Points 110

Conformément à la Documentation sur le JDK 8 jcmd est l'approche suggérée.

Il est conseillé d'utiliser le dernier utilitaire, jcmd, au lieu de l'utilitaire jstack, jinfo et jmap pour améliorer les diagnostics et réduire les performances. et de réduire les surcharges de performance.

Vous trouverez ci-dessous des commandes permettant d'obtenir les propriétés et les drapeaux que vous souhaitez.

jcmd pid VM.system_properties
jcmd pid VM.flags

Nous avons besoin de la PID . Pour ce faire, utilisez jcmd -l comme ci-dessous

cd ~/javacode
jcmd -l

11441 Test
6294 Test
29197 jdk.jcmd/sun.tools.jcmd.JCmd -l

Il est maintenant temps d'utiliser ces PID pour obtenir les propriétés/étiquettes souhaitées.

Commandement : 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

Commandement : jcmd 11441 Sortie VM.flags :

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

Pour plus d'instructions sur l'utilisation de jcmd, voir mon blog .

35voto

Diego López Points 1411

Sous Linux :

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Sur Mac OS X :

java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'

Sous Windows :

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Source : Déterminez la taille de la mémoire vive de Java

30voto

Jarek Przygódzki Points 1215

Vous pouvez également utiliser jinfo

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

23voto

smas Points 8299

Si vous pouvez le faire en Java, essayez :

RuntimeMXBean

ManagementFactory

Exemple :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X