Подтвердить что ты не робот

Получение параметров запущенной JVM

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

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

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

4b9b3361

Ответ 1

Вы можете использовать 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

Ответ 2

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

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

Ответ 3

Я добавляю этот новый ответ, потому что в соответствии с документацией JDK8 сейчас предлагается jcmd.

Рекомендуется использовать последнюю версию утилиты jcmd вместо предыдущих утилит jstack, jinfo и jmap для расширенной диагностики и снижения производительности.

Ниже приведены команды для получения желаемых свойств/флагов.

jcmd pid VM.system_properties
jcmd pid VM.flags

Нам нужен pid, для этого используйте jcmd -l, как показано ниже

[email protected]:~/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 см. В моем блоге

Ответ 4

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

RuntimeMXBean

ManagementFactory

Пример:

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

Ответ 5

В 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/

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

Можем ли мы извлечь свойства приложения.

Мое приложение находится в Grails, и конфигурационный файл - отличный. Файл был удален, но приложение все еще функционирует, приложение развернуто в tomcat. Есть ли возможность извлечь значения ключей свойств приложения из JVM.