Abrufen der Parameter einer laufenden JVM

87

Gibt es eine Möglichkeit, die Parameter einer laufenden JVM abzurufen? Gibt es ein Befehlszeilenprogramm wie jstat, das die PID der JVM als Eingabe verwendet und ihre Startparameter zurückgibt? Ich interessiere mich besonders für die Werte -Xmx und -Xms, die beim Starten der JVM angegeben wurden. Danke dir.

Bearbeiten : Um meine Einschränkungen zu klären. Die JVM, die wir überprüfen möchten, wird auf einem Produktionsserver ausgeführt. Deshalb bevorzugen wir die minimale Störung. Wir können die JVM mit jstat überwachen und hoffen, dass es eine ähnlich einfache Lösung für den Zugriff auf die Parameter gibt.

Bearbeiten : Wir haben auch versucht, die Parameter mit jvisualvm abzurufen. Um jedoch eine Verbindung zu einer Remote-JVM herzustellen, müssen Sie JSTATD ausführen und die Sicherheitseinstellungen der JVM ändern, die auf einem Produktionsserver als sehr störend und riskant eingestuft wurden.

HH
quelle
Dort finden Sie ein Tool: JDK Tools and Utilities
Guillaume Husta

Antworten:

140

Sie können jps wie verwenden

jps -lvm

druckt so etwas wie

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
quelle
6
Klappt wunderbar. Ich habe auch das jinfo-Tool im jdk entdeckt, das eine ähnliche Funktion hat
HH
2
Beachten Sie, dass die Ausgabe von jps -lvmmöglicherweise irreführend ist. Überprüfen Sie dies immer mit jinfo oder einem anderen Tool. Das Problem kann sein, wenn "-XX" wie das normale Programmargument übergeben und von JVM ignoriert wird. Dies ist der Fall, wenn Sie java -jar my.jar -Xmx3ganstelle vonjava -Xmx3g -jar my.jar
Juraj Martinka
33

Ich füge diese neue Antwort hinzu, da gemäß der JDK8-Dokumentation jcmd jetzt als Ansatz vorgeschlagen wird.

Es wird empfohlen, das neueste Dienstprogramm jcmd anstelle der vorherigen Dienstprogramme jstack, jinfo und jmap zu verwenden, um die Diagnose zu verbessern und den Leistungsaufwand zu verringern.

Unten finden Sie Befehle, um Ihre gewünschten Eigenschaften / Flags abzurufen.

jcmd pid VM.system_properties
jcmd pid VM.flags

Wir brauchen pid, für diese Verwendung jcmd -l, wie unten

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

Jetzt ist es Zeit, diese Pids zu verwenden, um die gewünschten Eigenschaften / Flags zu erhalten

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

Befehl: jcmd 11441 VM.flags Ausgabe:

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 

Weitere Anweisungen zur Verwendung von jcmd finden Sie in meinem Blogbeitrag

Vipin
quelle
Es konnten keine passenden Prozesse gefunden werden: 'pid'
Ch Vas
1
pid sollte durch java process id ersetzt werden, Linux os im Allgemeinen erhalten wir es durch "ps -ef | grep jdk ”, wenn Sie mehrere Prozesse sehen, dann stellen Sie eine neue Frage oder versuchen Sie, sie zu googeln
Vipin
22

Unter Linux:

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

Unter Mac OSX:

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

Unter Windows:

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

Quelle: https://www.mkyong.com/java/find-out-your-java-heap-memory-size/

Diego López
quelle
21

Alternativ können Sie jinfo verwenden

jinfo -flags <vmid> 
jinfo -sysprops <vmid>
Jarek Przygódzki
quelle
3
Dieses Dienstprogramm wird nicht unterstützt und ist möglicherweise in zukünftigen Versionen des JDK verfügbar oder nicht.
GoYun.Info
-flagsOption existiert nicht in OpenJDK 64-Bit-Server-VM (Build 1.8.0_111-intern-alpin-r0-b14) (aktuelles java:8u111-jdk-alpineDocker-Image)
Anthony O.
Ich habe diese Antwort mit Blick auf Java 6/7 geschrieben. Darüber hinaus ist jinfo unzuverlässig, flagsfunktioniert aber mit dem offiziellen Docker-Java-Image basierend auf Debian Jessie docker run --rm -it java:8u111-jdk java -version && jinfo -h
Jarek Przygódzki
15

Wenn Sie dies in Java tun können, versuchen Sie:

RuntimeMXBean

ManagementFactory

Beispiel:

RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> jvmArgs = runtimeMXBean.getInputArguments();
for (String arg : jvmArgs) {
    System.out.println(arg);
}
lukastymo
quelle
1
Liefert nur Werte, wenn sie übergeben wurden, daher keine Standardeinstellungen.
Behe
8

JConsole kann es schaffen. Sie können auch ein leistungsstarkes jvisualVM-Tool verwenden, das seit 1.6.0.8 auch in JDK enthalten ist.

Vladimir Ivanov
quelle
1

Windows 10 oder Windows Server 2016 stellen solche Informationen in ihrem Standard-Task-Manager bereit. Ein seltener Fall für die Produktion, aber wenn die Ziel-JVM unter Windows ausgeführt wird, können Sie die Parameter am einfachsten anzeigen, indem Sie Strg + Alt + Entf drücken, die Registerkarte Prozesse auswählen und die Befehlszeilenspalte hinzufügen (indem Sie mit der rechten Maustaste darauf klicken eine vorhandene Spaltenüberschrift).

Roman Khomyshynets
quelle
1

Wenn Sie daran interessiert sind, die JVM-Parameter eines laufenden Java-Prozesses abzurufen, töten Sie einfach -3 java-pid. Sie erhalten eine Core-Dump-Datei, in der Sie die beim Starten der Java-Anwendung verwendeten JVM-Parameter finden.

Lambzee
quelle
1

Unter Linux können Sie diesen Befehl ausführen und das Ergebnis anzeigen:

ps aux | grep "java"
Etienne
quelle
Mein Unternehmen verwendet Red Hat Linux und ich habe nur sehr eingeschränkten Zugriff auf das System. ps aux | Der Befehl grep "java" listet alle Java-Befehle mit ihren jvm-Argumenten auf, und wir können bei Bedarf sogar das genaue jvm-Argument grep. Dies ist sehr nützlich, wenn andere Tools wie jps, jcmd usw. nicht verfügbar / zugänglich sind.
AGan
0

Sie können den JConsole-Befehl (oder einen anderen JMX-Client) verwenden, um auf diese Informationen zuzugreifen.

nfechner
quelle
0

Diese Technik gilt für alle Java-Anwendungen, die lokal oder remote ausgeführt werden.

  1. Starten Sie Ihre Java-Anwendung.
  2. Führen Sie JVisualVM aus, das Sie in Ihrem JDK gefunden haben (z. B. C: \ Programme \ Java \ jdk1.8.0_05 \ bin \ jvisualvm.exe).
  3. Wenn dieses nützliche Tool gestartet wird, sehen Sie sich die Liste der ausgeführten Java-Anwendungen unter dem Baumknoten "Lokal" an.
  4. Doppelklicken Sie auf [Ihre Anwendung] (pid [n]).
  5. Auf der rechten Seite finden Sie auf der Registerkarte Inspektionsinhalte für die Anwendung. In der Mitte der Registerkarte Übersicht sehen Sie die JVM-Argumente für die Anwendung.

jvisualvm ist seit JDK 6 Update 7 in jedem JDK zu finden. Das Video-Tutorial zu jvisualvm finden Sie hier.

Javajon
quelle
OP erklärte ausdrücklich, dass jvisualvm keine Option sei.
Olivier Gérardin
0

_JAVA_OPTIONS ist eine env-Variable, die erweitert werden kann.

echo $_JAVA_OPTIONS
zee
quelle