Pobieranie parametrów działającej maszyny JVM

90

Czy istnieje sposób na uzyskanie parametrów działającej maszyny JVM? Czy istnieje narzędzie wiersza poleceń, takie jak jstat, które pobiera jako dane wejściowe pid maszyny JVM i zwraca jej parametry początkowe? Szczególnie interesują mnie wartości -Xmx i -Xms, które zostały podane podczas uruchamiania maszyny JVM. Dziękuję Ci.

Edycja : aby wyjaśnić moje ograniczenia. Maszyna JVM, którą chcielibyśmy sprawdzić, działa na serwerze produkcyjnym. Dlatego wolimy jak najmniej zakłóceń. Jesteśmy w stanie monitorować maszynę JVM za pomocą jstat, więc mamy nadzieję, że istnieje podobne proste rozwiązanie dostępu do parametrów.

Edycja : Próbowaliśmy również uzyskać parametry za pomocą jvisualvm. Aby jednak połączyć się ze zdalnym jvm, musimy uruchomić jstatd i zmodyfikować ustawienia bezpieczeństwa maszyny JVM, co okazało się bardzo uciążliwe i ryzykowne na serwerze produkcyjnym.

HH
źródło
Możesz tam znaleźć narzędzie: JDK Tools and Utilities
Guillaume Husta

Odpowiedzi:

145

Możesz użyć jps jak

jps -lvm

drukuje coś w rodzaju

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
źródło
6
Działa jak marzenie. Odkryłem również narzędzie jinfo w jdk, które ma podobną funkcję
HH
2
Zwróć uwagę, że dane wyjściowe polecenia jps -lvmmogą być mylące. Zawsze sprawdzaj ponownie za pomocą jinfo lub innego narzędzia. Problem może wystąpić, jeśli „-XX” zostanie przekazane jak zwykły argument programu i zignorowane przez JVM. Tak jest, jeśli używasz java -jar my.jar -Xmx3gzamiastjava -Xmx3g -jar my.jar
Juraj Martinka
36

Dodaję tę nową odpowiedź, ponieważ zgodnie z dokumentacją JDK8 sugeruje się teraz podejście jcmd.

Zaleca się użycie najnowszego narzędzia jcmd zamiast poprzednich narzędzi jstack, jinfo i jmap w celu ulepszenia diagnostyki i zmniejszenia narzutu wydajności.

Poniżej znajdują się polecenia umożliwiające uzyskanie żądanych właściwości / flag.

jcmd pid VM.system_properties
jcmd pid VM.flags

Potrzebujemy pid, do tego użyj jcmd -l, jak poniżej

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

Teraz czas użyć tych pidów, aby uzyskać żądane właściwości / flagi

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

Polecenie: jcmd 11441 VM.flags dane wyjściowe:

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 

Więcej instrukcji użycia jcmd znajdziesz w moim wpisie na blogu

Vipin
źródło
Nie można znaleźć żadnego procesu pasującego do: „pid”
Ch Vas
1
pid należy zastąpić identyfikatorem procesu java, system operacyjny Linux generalnie otrzymujemy go jako „ps -ef | grep jdk ”, jeśli widzisz wiele procesów, zadaj nowe pytanie lub spróbuj wyszukać w Google
Vipin,
23

W systemie Linux:

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

W systemie Mac OSX:

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

W systemie Windows:

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

Źródło: https://www.mkyong.com/java/find-out-your-java-heap-memory-size/

Diego López
źródło
21

Alternatywnie możesz użyć jinfo

jinfo -flags <vmid> 
jinfo -sysprops <vmid>
Jarek Przygódzki
źródło
3
To narzędzie nie jest obsługiwane i może, ale nie musi być dostępne w przyszłych wersjach zestawu JDK.
GoYun.Info
-flagsopcja nie istnieje w 64-bitowej maszynie wirtualnej serwera OpenJDK (kompilacja 1.8.0_111-internal-alpine-r0-b14) (aktualny java:8u111-jdk-alpineobraz Dockera)
Anthony
Napisałem tę odpowiedź z myślą o Javie 6/7. Poza tym Jinfo jest zawodna, ale flagswspółpracuje z oficjalnej Docker java obrazu opartego na Debianie Jessie docker run --rm -it java:8u111-jdk java -version && jinfo -h
Jarek Przygodzki
15

Jeśli możesz to zrobić w Javie, spróbuj:

RuntimeMXBean

ManagementFactory

Przykład:

RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> jvmArgs = runtimeMXBean.getInputArguments();
for (String arg : jvmArgs) {
    System.out.println(arg);
}
lukastymo
źródło
1
Poda wartości tylko wtedy, gdy zostało przekazane, stąd brak ustawień domyślnych.
Behe
8

JConsole to potrafi. Możesz także użyć potężnego narzędzia jvisualVM, które również jest zawarte w JDK od wersji 1.6.0.8.

Vladimir Ivanov
źródło
3

W systemie Linux możesz uruchomić to polecenie i zobaczyć wynik:

ps aux | grep "java"
Etienne
źródło
Moja firma korzysta z Red Hat Linux i mam bardzo ograniczony dostęp do systemu. ps aux | Polecenie grep "java" wyświetla listę wszystkich poleceń java wraz z ich argumentami jvm, a nawet w razie potrzeby możemy grepować dokładny argument jvm. Jest to bardzo przydatne w przypadku, gdy inne narzędzia, takie jak jps, jcmd itp., Nie są dostępne / dostępne.
AGan
1

Windows 10 lub Windows Server 2016 podają takie informacje w swoim standardowym menedżerze zadań. Rzadki przypadek w produkcji, ale jeśli docelowa maszyna JVM działa w systemie Windows, najprostszym sposobem sprawdzenia jej parametrów jest naciśnięcie Ctrl + Alt + Delete, wybranie zakładki Procesy i dodanie kolumny Wiersz poleceń (klikając prawym przyciskiem myszy na dowolny istniejący nagłówek kolumny).

Roman Khomyshynets
źródło
1

Jeśli chcesz uzyskać parametry JVM działającego procesu java, po prostu wykonaj kill -3 java-pid. Otrzymasz plik zrzutu pamięci, w którym możesz znaleźć parametry jvm używane podczas uruchamiania aplikacji java.

lambzee
źródło
0

Aby uzyskać dostęp do tych informacji, można użyć komendy JConsole (lub dowolnego innego klienta JMX).

nfechner
źródło
0

Ta technika ma zastosowanie do wszystkich aplikacji Java działających lokalnie lub zdalnie.

  1. Uruchom aplikację java.
  2. Uruchom JVisualVM znaleziony w tobie JDK (taki jak C: \ Program Files \ Java \ jdk1.8.0_05 \ bin \ jvisualvm.exe).
  3. Po uruchomieniu tego przydatnego narzędzia spójrz na listę uruchomionych aplikacji Java w węźle drzewa „Lokalne”.
  4. Kliknij dwukrotnie [swoją aplikację] (pid [n]).
  5. Po prawej stronie w zakładce aplikacji znajduje się treść inspekcji. W środku zakładki Przegląd zobaczysz argumenty JVM dla aplikacji.

jvisualvm można znaleźć w każdym JDK od JDK 6 Update 7. Samouczek wideo dotyczący jvisualvm jest tutaj.

javajon
źródło
OP wyraźnie stwierdził, że jvisualvm nie wchodzi w grę.
Olivier Gérardin
0

_JAVA_OPTIONS to zmienna env, którą można rozwinąć.

echo $_JAVA_OPTIONS
zee
źródło