Existe-t-il un moyen d'obtenir les paramètres d'une machine virtuelle Java en cours d'exécution? Existe-t-il un outil de ligne de commande tel que jstat qui prend en entrée le pid de la machine virtuelle Java et renvoie ses paramètres de départ? Je suis particulièrement intéressé par les valeurs -Xmx et -Xms qui ont été fournies lors du démarrage de la machine virtuelle Java. Je vous remercie.
Edit : Pour clarifier mes contraintes. La machine virtuelle que nous souhaitons vérifier est en cours d'exécution sur un serveur de production. C'est pourquoi, nous préférons le minimum de perturbations. Nous sommes en mesure de surveiller la machine virtuelle Java à l’aide de jstat. Nous espérons donc qu’il existe une solution simple similaire pour accéder aux paramètres.
Edit : Nous avons également essayé d’obtenir les paramètres avec jvisualvm. Mais pour se connecter à une machine virtuelle distante, nous devons exécuter jstatd et modifier les paramètres de sécurité de la machine virtuelle Java, ce qui nous a semblé très perturbant et risqué sur un serveur de production.
Vous pouvez utiliser des jps comme
jps -lvm
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
Alternativement, vous pouvez utiliser jinfo
jinfo -flags <vmid>
jinfo -sysprops <vmid>
Cela peut être fait avec jcmd aussi
jcmd pid VM.system_properties
jcmd pid VM.flags
J'ajoute cette nouvelle réponse car, conformément à la documentation JDK8 jcmd est une approche suggérée maintenant.
Il est suggéré d'utiliser le dernier utilitaire, jcmd, au lieu de Utilitaires précédents jstack, jinfo et jmap pour des diagnostics améliorés et une réduction des frais généraux.
jcmd pid 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
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
Si vous pouvez le faire en Java, essayez:
Exemple:
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> jvmArgs = runtimeMXBean.getInputArguments();
for (String arg : jvmArgs) {
System.out.println(arg);
}
Sous Linux:
Java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Sur Mac OSX:
Java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
Sous Windows:
C:\>Java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Source: https://www.mkyong.com/Java/find-out-your-Java-heap-memory-size/
JConsole peut le faire. Vous pouvez également utiliser un puissant outil jvisualVM, également inclus dans JDK depuis la version 1.6.0.8.
Cette technique s'applique à toute application Java exécutant local ou distant.
jvisualvm se trouve dans n’importe quel kit JDK depuis la mise à jour 7 de JDK 6. Le didacticiel vidéo sur jvisualvm est ici.
Windows 10 ou Windows Server 2016 fournissent ces informations dans leur gestionnaire de tâches standard. Un cas rare de production, mais si la machine virtuelle Java cible est exécutée sous Windows, le moyen le plus simple de voir ses paramètres consiste à appuyer sur Ctrl + Alt + Suppr, à choisir l'onglet Processus et à ajouter la colonne Ligne de commande (en cliquant avec le bouton droit de la souris sur un en-tête de colonne existant).
Si vous souhaitez obtenir les paramètres JVM d'un processus Java en cours d'exécution, supprimez simplement -3 Java-pid. Vous obtiendrez un fichier de vidage principal dans lequel vous pourrez trouver les paramètres JVM utilisés lors du lancement de l'application Java.
Vous pouvez utiliser la commande JConsole (ou tout autre client JMX) pour accéder à ces informations.