У меня есть Windows Server со сторонним приложением на нем, которое работает как служба Windows. Сервис/приложение является на самом деле виртуальной машиной Java однако, он отображается в диспетчере задач как exe (давайте назовем его foo.exe
).
Я знаю, что программа разработана для поднимания предпочтений выделения размера "кучи" JVM из реестра, и я знаю, где в реестре это ищет ту информацию. Однако я не уверен, отредактировал ли администратор реестр прежде (или после) запуск сервиса.
Так как это - производственная система, я отказываюсь перезапустить сервис (особенно, если он уже использует значения выделения "кучи", я вижу в реестре теперь). Есть ли какой-либо другой способ, которым я могу сказать, не перезапуская сервис? Я предполагаю, что мог посмотреть на в настоящее время память использования в диспетчере задач, но это не обеспечит точные значения.
Найдите в папке «C: \ Program Files (x86) \ Foo Vender» любой текстовый файл, содержащий строки -Xms
и -Xmx
- он мог получать значения из файла INI
. Если таковых нет, скорее всего, они откуда-то из реестра, как вы и предполагали. Один из моих клиентов использует веб-прокси, который работает как служба Windows и получает параметры запуска из установленного ключа реестра.
Если вы хотите точно подтвердить, какие файлы или ключи реестра читаются во время запуска EXE, при запуске службы используйте ProcMon от Sysinternals.
Обратите внимание, что ответ ниже может потребовать включения 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, из моего тестирования.
Показать столбец командной строки в диспетчере задач, который должен иметь настройки, предполагая, что они были переданы в командной строке: