web-dev-qa-db-fra.com

Obtenir les paramètres d'une machine virtuelle Java en cours d'exécution

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.

70
H-H

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
114
Peter Lawrey

Alternativement, vous pouvez utiliser jinfo

jinfo -flags <vmid> 
jinfo -sysprops <vmid>
20
Jarek Przygódzki

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 
18
Vipin

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);
}
13
smas

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/

11
Diego López

JConsole peut le faire. Vous pouvez également utiliser un puissant outil jvisualVM, également inclus dans JDK depuis la version 1.6.0.8.

8
Vladimir Ivanov

Cette technique s'applique à toute application Java exécutant local ou distant.

  1. Lancez votre application Java.
  2. Exécutez JVisualVM trouvé dans votre JDK (tel que C:\Program Files\Java\jdk1.8.0_05\bin\jvisualvm.exe).
  3. Lorsque cet outil utile démarre, consultez la liste des applications Java en cours d’exécution sous le nœud d’arborescence "Local".
  4. Double-cliquez sur [votre application] (pid [n]).
  5. Sur le côté droit, il y aura le contenu de l'inspection dans l'onglet pour l'application Au milieu de l'onglet Présentation, vous verrez les arguments JVM De l'application.

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.

1
javajon

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).

1
Roman Khomyshynets

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.

1
lambzee

Vous pouvez utiliser la commande JConsole (ou tout autre client JMX) pour accéder à ces informations.

0
nfechner