Отримання параметрів запущеного JVM


90

Чи є спосіб отримати параметри запущеної JVM? Чи існує такий інструмент командного рядка, як jstat, який приймає як вхід pid JVM і повертає його початкові параметри? Мене особливо цікавлять значення -Xmx та -Xms, які були вказані під час запуску JVM. Дякую.

Редагувати : Щоб пояснити мої обмеження. JVM, який ми хотіли б перевірити, працює на робочому сервері. Ось чому ми віддаємо перевагу мінімальним зривам. Ми можемо відстежувати JVM за допомогою jstat, і тому ми сподіваємось, що існує подібне просте рішення для доступу до параметрів.

Редагувати : Ми також намагалися отримати параметри за допомогою jvisualvm. Але для того, щоб підключитися до віддаленого jvm, нам потрібно запустити jstatd і змінити налаштування безпеки JVM, які ми виявили дуже руйнівними та ризикованими на робочому сервері.


Ви можете знайти там інструмент: JDK Tools and Utilities
Гійом Хуста

Відповіді:


145

Ви можете використовувати jps like

jps -lvm

друкує щось на зразок

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

6
Працює як шарм. Я також виявив інструмент jinfo в jdk, який має подібну функцію
HH

2
Зверніть увагу, що результат jps -lvmможе вводити в оману. Завжди переглядайте jinfo або інший інструмент. Проблема може полягати в тому, що "-XX" передається як звичайний аргумент програми та ігнорується JVM. Це випадок, якщо ви використовуєте java -jar my.jar -Xmx3gзамістьjava -Xmx3g -jar my.jar
Juraj Martinka

36

Я додаю цю нову відповідь, оскільки згідно з документацією JDK8 jcmd пропонується підходити зараз.

Пропонується використовувати найновішу утиліту jcmd замість попередніх утиліт jstack, jinfo та jmap для розширеної діагностики та зменшення накладних витрат.

Нижче наведені команди для отримання ваших властивостей / прапорів, які ви хочете.

jcmd pid VM.system_properties
jcmd pid VM.flags

Нам потрібен pid, для цього використовуйте jcmd -l, як показано нижче

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

Тепер настав час використовувати ці pids для отримання властивостей / прапорів, які ви хочете

Команда: 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

Команда: jcmd 11441 VM. Виведення прапорів:

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 

Докладніші вказівки щодо користування jcmd див. У моєму дописі в блозі


Не вдалося знайти процеси, що відповідають: 'pid'
Ch Vas,

1
pid слід замінити ідентифікатором Java-процесу, Linux os, як правило, ми отримуємо його за допомогою “ps -ef | grep jdk ", якщо ви бачите кілька процесів за цим, то задайте нове запитання або спробуйте
погуглити


21

Крім того, ви можете використовувати jinfo

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

3
Ця утиліта не підтримується і може бути або не бути доступною в майбутніх версіях JDK.
GoYun.Info

-flagsпараметр не існує у OpenJDK 64-розрядна серверна віртуальна машина (збірка 1.8.0_111-internal-alpine-r0-b14) (поточне java:8u111-jdk-alpineзображення Docker)
Ентоні О.

Цю відповідь я написав з урахуванням Java 6/7. Крім того, jinfo ненадійний, але flagsпрацює з офіційним java-зображенням Docker на основі Debian Jessie docker run --rm -it java:8u111-jdk java -version && jinfo -h
Jarek Przygódzki

15

Якщо ви можете зробити це в Java, спробуйте:

RuntimeMXBean

Управління фабрикою

Приклад:

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

1
Надаватиме значення лише в тому випадку, якщо воно було передано, отже, налаштування за замовчуванням відсутні.
Behe

8

JConsole може це зробити. Також ви можете використовувати потужний інструмент jvisualVM, який також включений у JDK з 1.6.0.8.


2

У Linux ви можете запустити цю команду і побачити результат:

ps aux | grep "java"

Моя компанія використовує Red Hat Linux, і я маю дуже обмежений доступ до системи. ps aux | Команда grep "java" перелічує всі команди java з їхніми аргументами jvm, і ми можемо навіть grep точний аргумент jvm, якщо це потрібно. Це дійсно корисно, якщо будь-які інші інструменти, такі як jps, jcmd тощо, недоступні / доступні.
AGan

1

Windows 10 або Windows Server 2016 надають таку інформацію у своєму стандартному диспетчері завдань. Рідкісний випадок виробництва, але якщо цільова JVM працює в Windows, найпростіший спосіб побачити її параметри - натиснути Ctrl + Alt + Delete, вибрати вкладку Процеси та додати стовпець командного рядка (клацнувши правою кнопкою миші на будь-який існуючий заголовок стовпця).


1

Якщо ви зацікавлені в отриманні параметрів JVM запущеного Java-процесу, тоді просто вбийте -3 java-pid. Ви отримаєте основний файл дампа, в якому ви зможете знайти параметри jvm, що використовуються під час запуску програми Java.


0

Ви можете використовувати команду JConsole (або будь-який інший клієнт JMX) для доступу до цієї інформації.


0

Цей прийом застосовується до будь-яких програм Java, що працюють локально або віддалено.

  1. Запустіть програму Java.
  2. Запустіть JVisualVM знайдений у вас JDK (наприклад, C: \ Program Files \ Java \ jdk1.8.0_05 \ bin \ jvisualvm.exe).
  3. Коли цей корисний інструмент запуститься, перегляньте список запущених програм Java під вузлом дерева "Локальний".
  4. Двічі клацніть [вашу заявку] (pid [n]).
  5. На правій стороні буде розміщено інспекційний вміст у вкладці програми. У середині вкладки Огляд ви побачите аргументи JVM для програми.

jvisualvm можна знайти в будь-якому JDK, починаючи з JDK 6, оновлення 7. Відеоурок з jvisualvm тут.


OP прямо заявив, що jvisualvm не є варіантом.
Олів’є Жерарден

0

_JAVA_OPTIONS - це змінна env, яку можна розширити.

echo $_JAVA_OPTIONS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.