Obtention des paramètres d'une JVM en cours d'exécution

90

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 comme jstat qui prend en entrée le pid de la JVM et renvoie ses paramètres de départ? Je suis particulièrement intéressé par les valeurs -Xmx et -Xms qui ont été données lors du démarrage de la JVM. Merci.

Edit : Pour clarifier mes contraintes. La JVM que nous souhaitons vérifier fonctionne sur un serveur de production. C'est pourquoi, nous préférons la 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.

Edit : Nous avons également essayé d'obtenir les paramètres en utilisant jvisualvm. Mais pour se connecter à une jvm distante, nous devons exécuter jstatd et modifier les paramètres de sécurité de la JVM, ce que nous avons trouvé très perturbateur et risqué sur un serveur de production.

HH
la source
Vous pouvez y trouver un outil: Outils et utilitaires JDK
Guillaume Husta

Réponses:

145

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
Peter Lawrey
la source
6
Fonctionne comme un charme. J'ai aussi découvert l'outil jinfo dans le jdk qui a une fonction similaire
HH
2
Notez que la sortie de jps -lvmpeut être trompeuse. Vérifiez toujours avec jinfo ou un autre outil. Le problème peut être si "-XX" est passé comme l'argument de programme normal et ignoré par JVM. C'est le cas si vous utilisez à la java -jar my.jar -Xmx3gplace dejava -Xmx3g -jar my.jar
Juraj Martinka
36

J'ajoute cette nouvelle réponse car, selon la documentation JDK8 , jcmd est une approche suggérée maintenant.

Il est suggéré d'utiliser le dernier utilitaire, jcmd au lieu des utilitaires jstack, jinfo et jmap précédents pour des diagnostics améliorés et une réduction des performances.

Vous trouverez ci-dessous des commandes pour obtenir vos propriétés / indicateurs souhaités.

jcmd pid VM.system_properties
jcmd pid VM.flags

Nous avons besoin de pid, pour cela utilisez jcmd -l, comme ci-dessous

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

Il est maintenant temps d'utiliser ces pids pour obtenir les propriétés / indicateurs que vous voulez

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

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

Pour plus d'instructions sur les utilisations de jcmd, consultez mon article de blog

Vipin
la source
Impossible de trouver des processus correspondant à: 'pid'
Ch Vas
1
pid devrait être remplacé par l'identifiant de processus java, Linux os généralement nous l'obtenons par «ps -ef | grep jdk », si vous voyez plusieurs processus par là, posez une nouvelle question ou essayez de le rechercher sur Google
Vipin
23

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/

Diego López
la source
21

Vous pouvez également utiliser jinfo

jinfo -flags <vmid> 
jinfo -sysprops <vmid>
Jarek Przygódzki
la source
3
Cet utilitaire n'est pas pris en charge et peut être disponible ou non dans les futures versions du JDK.
GoYun.Info
-flagsoption n'existe pas dans OpenJDK 64 bits serveur VM (build-1.8.0_111-alpine-r0-b14 interne) (courant d' java:8u111-jdk-alpineimage Docker)
Anthony O.
J'ai écrit cette réponse en pensant à Java 6/7. Au-delà de cela, jinfo n'est pas fiable, mais flagsfonctionne avec l'image Java officielle de Docker basée sur Debian Jessie docker run --rm -it java:8u111-jdk java -version && jinfo -h
Jarek Przygódzki
15

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);
}
lukastymo
la source
1
Ne fournira des valeurs que si elles ont été passées, donc pas de paramètres par défaut.
Behe
8

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

Vladimir Ivanov
la source
3

Sous Linux, vous pouvez exécuter cette commande et voir le résultat:

ps aux | grep "java"
Etienne
la source
Mon entreprise utilise Red Hat Linux et j'ai un accès très limité au système. ps aux | La commande grep "java" liste toutes les commandes java avec leurs arguments jvm et nous pouvons même grep l'argument jvm exact si nécessaire. Ceci est vraiment utile dans le cas où d'autres outils tels que jps, jcmd, etc. ne sont pas disponibles / accessibles.
AGan
1

Windows 10 ou Windows Server 2016 fournissent ces informations dans leur gestionnaire de tâches standard. Un cas rare pour la production, mais si la JVM cible s'exécute sous Windows, le moyen le plus simple de voir ses paramètres est d'appuyer sur Ctrl + Alt + Suppr, de choisir l' onglet Processus et d'ajouter la colonne Ligne de commande (en cliquant avec le bouton droit de la souris sur tout en-tête de colonne existant).

Roman Khomyshynets
la source
1

Si vous souhaitez obtenir les paramètres JVM d'un processus java en cours d'exécution, faites simplement kill -3 java-pid. Vous obtiendrez un fichier de vidage de mémoire dans lequel vous pourrez trouver les paramètres jvm utilisés lors du lancement de l'application java.

lambzee
la source
0

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

nfechner
la source
0

Cette technique s'applique à toute application Java exécutée en local ou à distance.

  1. Démarrez 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, regardez 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 Vue d'ensemble, vous verrez les arguments JVM de l'application.

jvisualvm peut être trouvé dans n'importe quel JDK depuis JDK 6 Update 7. Le didacticiel vidéo sur jvisualvm est ici.

javajon
la source
OP a explicitement déclaré que jvisualvm n'était pas une option.
Olivier Gérardin
0

_JAVA_OPTIONS est une variable d'environnement qui peut être développée.

echo $_JAVA_OPTIONS
zee
la source