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

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

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

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

3
задан 5 December 2014 в 03:42
3 ответа

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

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

1
ответ дан 3 December 2019 в 05:42

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

2
ответ дан 3 December 2019 в 05:42

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

task manager

2
ответ дан 3 December 2019 в 05:42

Теги

Похожие вопросы