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.
Odpowiedzi:
Możesz użyć jps jak
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
źródło
jps -lvm
mogą 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żywaszjava -jar my.jar -Xmx3g
zamiastjava -Xmx3g -jar my.jar
Dodaję tę nową odpowiedź, ponieważ zgodnie z dokumentacją JDK8 sugeruje się teraz podejście jcmd.
Poniżej znajdują się polecenia umożliwiające uzyskanie żądanych właściwości / flag.
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
źródło
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/
źródło
Alternatywnie możesz użyć jinfo
źródło
-flags
opcja nie istnieje w 64-bitowej maszynie wirtualnej serwera OpenJDK (kompilacja 1.8.0_111-internal-alpine-r0-b14) (aktualnyjava:8u111-jdk-alpine
obraz Dockera)flags
współpracuje z oficjalnej Docker java obrazu opartego na Debianie Jessiedocker run --rm -it java:8u111-jdk java -version && jinfo -h
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); }
źródło
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.
źródło
W systemie Linux możesz uruchomić to polecenie i zobaczyć wynik:
ps aux | grep "java"
źródło
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).
źródło
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.
źródło
Aby uzyskać dostęp do tych informacji, można użyć komendy JConsole (lub dowolnego innego klienta JMX).
źródło
Ta technika ma zastosowanie do wszystkich aplikacji Java działających lokalnie lub zdalnie.
jvisualvm można znaleźć w każdym JDK od JDK 6 Update 7. Samouczek wideo dotyczący jvisualvm jest tutaj.
źródło
_JAVA_OPTIONS to zmienna env, którą można rozwinąć.
źródło