web-dev-qa-db-ger.com

Abrufen der Parameter einer laufenden JVM

Gibt es eine Möglichkeit, die Parameter einer laufenden JVM abzurufen? Gibt es ein Befehlszeilentool wie jstat, das die PID der JVM als Eingabe übernimmt und seine Startparameter zurückgibt? Ich bin besonders an den -Xmx- und -Xms-Werten interessiert, die beim Starten der JVM angegeben wurden. Vielen Dank.

Bearbeiten : Um meine Einschränkungen zu klären. Die JVM, die wir prüfen möchten, läuft auf einem Produktionsserver. Deshalb bevorzugen wir die minimale Störung. Wir können die JVM mit jstat überwachen und hoffen, dass es eine ähnlich einfache Lösung gibt, um auf die Parameter zuzugreifen.

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

70
H-H

Sie können jps gerne verwenden

jps -lvm

druckt so etwas

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

Alternativ können Sie jinfo verwenden.

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

Dies kann auch mit Jcmd erfolgen

jcmd pid VM.system_properties
jcmd pid VM.flags

Ich füge diese neue Antwort hinzu, da laut JDK8-Dokumentation jcmd ein Ansatz vorgeschlagen wird.

Es wird empfohlen, das neueste Dienstprogramm jcmd anstelle von .__ zu verwenden. Vorherige Jstack-, Jinfo- und Jmap-Dienstprogramme für erweiterte Diagnosefunktionen und reduzierter Leistungsaufwand.

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

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

RuntimeMXBean

ManagementFabrik

Beispiel:

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

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/

11
Diego López

JConsole kann es schaffen. Sie können auch ein leistungsfähiges jvisualVM-Tool verwenden, das seit 1.6.0.8 ebenfalls im JDK enthalten ist.

8
Vladimir Ivanov

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 in Ihrem JDK aus (z. B. C:\Programme Dateien\Java\jdk1.8.0_05\bin\jvisualvm.exe).
  3. Wenn dieses nützliche Tool gestartet wird, sehen Sie sich die Liste der aktiven Java-Anwendung unter dem Baumknoten "" "Local" an.
  4. Doppelklicken Sie auf [Ihre Anwendung] (pid [n]).
  5. Auf der rechten Seite befinden sich Inspektionsinhalte in der Registerkarte für die Anwendung In der Mitte der Registerkarte Übersicht werden die JVM-Argumente für die Anwendung angezeigt.

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

1
javajon

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 ihre Parameter am einfachsten anzeigen, indem Sie die Tastenkombination Strg + Alt + Entf drücken, die Registerkarte Processes auswählen und die Befehlszeile hinzufügen (durch Klicken mit der rechten Maustaste auf eine vorhandene Spaltenüberschrift).

1

Wenn Sie daran interessiert sind, die JVM-Parameter eines laufenden Java-Prozesses abzurufen, beenden Sie einfach -3 Java-pid. Sie erhalten eine Core-Dump-Datei, in der Sie die JVM-Parameter finden, die beim Starten der Java-Anwendung verwendet werden.

1
lambzee

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

0
nfechner