Получение параметров работающей JVM - PullRequest
73 голосов
/ 15 марта 2011

Есть ли способ получить параметры работающей JVM?Существует ли инструмент командной строки, такой как jstat, который принимает в качестве входных данных pid JVM и возвращает его начальные параметры?Меня особенно интересуют значения -Xmx и -Xms, которые были заданы при запуске JVM.Спасибо.

Редактировать : Чтобы уточнить мои ограничения.JVM, которую мы хотели бы проверить, работает на производственном сервере.Вот почему мы предпочитаем минимальные нарушения.Мы можем отслеживать JVM с помощью jstat, и поэтому мы надеемся, что есть аналогичное простое решение для доступа к параметрам.

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

Ответы [ 10 ]

120 голосов
/ 15 марта 2011

Вы можете использовать jps как

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
21 голосов
/ 17 октября 2017

Я добавляю этот новый ответ, потому что согласно документации 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.flags:

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 см. в моем блоге

20 голосов
/ 01 июля 2013

В качестве альтернативы вы можете использовать jinfo

jinfo -flags <vmid> 
jinfo -sysprops <vmid>
13 голосов
/ 18 августа 2016

В Linux:

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

В Mac OSX:

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

В Windows:

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

Источник: https://www.mkyong.com/java/find-out-your-java-heap-memory-size/

13 голосов
/ 15 марта 2011

Если вы можете сделать это в Java, попробуйте:

RuntimeMXBean

ManagementFactory

Пример:

RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> jvmArgs = runtimeMXBean.getInputArguments();
for (String arg : jvmArgs) {
    System.out.println(arg);
}
8 голосов
/ 15 марта 2011

JConsole может это сделать.Также вы можете использовать мощный инструмент jvisualVM, который также включен в JDK начиная с 1.6.0.8.

1 голос
/ 02 апреля 2019

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

1 голос
/ 22 января 2019

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

1 голос
/ 08 июля 2014

Этот метод применяется для любого Java-приложения, работающего локально или удаленно.

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

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

0 голосов
/ 15 марта 2011

Вы можете использовать команду JConsole (или любой другой клиент JMX) для доступа к этой информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...