Как проверить аргументы запуска размера кучи для активной JVM, работающей в качестве службы Windows и загружающей параметры JVM из реестра?

У меня есть сервер Windows со сторонним приложением, которое работает как служба Windows. Служба / приложение на самом деле является виртуальной машиной Java, однако она отображается в диспетчере задач как исполняемый файл (назовем его foo.exe).

Я знаю, что программа предназначена для получения из реестра параметров выделения размера кучи JVM, и я знаю, где в реестре она ищет эту информацию. При этом я не уверен, что администратор редактировал реестр до (или после) запуска службы.

Поскольку это производственная система, я не хочу перезапускать службу (особенно если она уже использует значения выделения кучи, которые я вижу в реестре сейчас). Есть ли другой способ, которым я могу сказать, БЕЗ перезапуска службы? Полагаю, я мог бы посмотреть на используемую в данный момент память в диспетчере задач, но это не позволило бы получить точные значения.

3 ответа

Покажите столбец командной строки в диспетчере задач, который должен иметь параметры, если они были переданы в командной строке:

диспетчер задач

Обратите внимание, что приведенный ниже ответ может потребовать включения JMX - я полагаю, что он отключен по умолчанию в общедоступной JRE и требует перезапуска JVM для его изменения, что было бы довольно бесполезно в вашем случае. Тем не менее, стоит попробовать?

Работают они или нет, также будет зависеть от конкретного собственного метода упаковки, используемого этим приложением.

Вы должны быть в состоянии скопировать эти инструменты вместе с jli.dll от JDK с соответствующей минорной версией и архитектурой до JRE, на котором вы работаете. Вы также можете запускать инструменты удаленно, хотя это вряд ли будет работать без первоначальной настройки из-за требований безопасности для удаленных подключений.


jps инструмент, доступный в JDK, должен быть в состоянии предоставить эту информацию командой jps -v, Если у вас запущено несколько процессов Java, вы можете идентифицировать их по PID в первом столбце.

Пример вывода в Netbeans (PID 9056) (который использует встроенную оболочку, аналогичную вашему приложению):

9056  -Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade -Dnetbeans.accept_
license_class=org.netbeans.license.AcceptLicense -client -Xss2m -Xms32m -XX:Perm
Size=32m -Dapple.laf.useScreenMenuBar=true -Dapple.awt.graphics.UseQuartz=true -
Dsun.java2d.noddraw=true -Dsun.java2d.dpiaware=true -Dsun.zip.disableMemoryMappi
ng=true -Xmx1024m <snip>

Обратите внимание на -Xss, -Xms а также -Xmx аргументы.


Еще одна вещь, которую вы можете попробовать jinfo, который позволяет вам нацеливаться на конкретный PID, например jinfo 9056,

ПРИМЕЧАНИЕ. - Эта утилита не поддерживается и может быть или не быть доступной в будущих версиях JDK.


Вы также можете попробовать jconsole а также jvisualvm хотя они, похоже, имеют проблемы с подключением к упакованным JVM и перечислением аргументов VM, из моего тестирования.

Посмотрите в "C:\Program Files (x86)\Foo Vender" любой текстовый файл, содержащий строки -Xms а также -Xmx - это может быть извлечение значений из INI файл. Если их нет, возможно, они где-то их получают из реестра, как вы и предполагали. Один из моих клиентов использует веб-прокси, который работает как служба Windows, и получает параметры запуска из установленного им ключа reg.

Если вы хотите точно определить, какие файлы или ключи реестра читаются при запуске EXE-файла, используйте ProcMon из Sysinternals при запуске службы.

Другие вопросы по тегам