Назад | Перейти на главную страницу

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

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

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

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

Обратите внимание, что ответ ниже мощь требуется, чтобы 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 при запуске службы.