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

Невозможно использовать профилирование JVisualVM для Tomcat7, работающего как служба в Windows7

Я пытаюсь профилировать Servlet, запущенный в Apache Tomcat (7.0.34), в качестве службы в Windows 7 (64 бит) с использованием JVisualVM (JDK 1.7.0 - 06, 64 бит), выполняемой локально.

Первоначально у меня была проблема с Tomcat, которая не показывалась в списке локальных приложений из-за различной ошибки/функции свойства java.io.tmp, но работала вокруг нее, как указано в нескольких сообщениях на этом форуме.

Однако, хотя процесс Tomcat теперь отображается в списке локальных приложений как "Локальное приложение", при открытии процесса нет вкладок для Monitor, Threads, Sampler или Profile - только вкладка "Обзор", для которой аргументы JVM и Вложенные вкладки Sytem Properties показывают опасное сообщение "не поддерживается для этого jvm".

Я дважды проверил следующие элементы:

  • что как Tomcat, так и JVisualVM работают с одной и той же версией Java, просматривая свойства JVM в JVisualVM (используя JMX-соединение для Tomcat)
  • что и Tomcat, и JVisualVM имеют один и тот же путь "java.io.tmp", просматривая системные свойства в JVisualVM (снова используя соединение JMX для Tomcat) И глядя на фактический каталог TMP/TEMP и подтверждающий, что PID файлы для обоих существуют
  • что файловая система NTFS
  • что пользователь Windows не имеет символа подчеркивания в имени (Примечание: у пользователя есть период в имени, поскольку мы используем сетевые логины формы "firstname.lastname", однако у меня нет проблем с просмотром другой Java приложений в JVisualVM, поэтому не думайте, что это проблема).
  • что Tomcat и JVisualVM выполняются как один и тот же пользователь Windows, просматривая процессы в диспетчере задач

Несколько заключительных пунктов:

  • Мне нужно Профиль сервлет, поэтому использование JMX недостаточно.
  • Мне удалось просмотреть профиль на компьютере под управлением Windows XP (Java 7, Tomcat 7 в качестве сервиса), так что это будет выглядеть как Windows 7/64 бит?

Если кто-то и решил эту проблему, очевидно, решение было бы очень оценено. Однако было бы полезно узнать, работают ли другие люди с одинаковой конфигурацией - 64-разрядная версия Windows 7, бит Java 7 64, Tomcat 7 работает как служба - успешно.

Обновление: Вместо того, чтобы работать как служба, я запускал Tomcat с использованием командного файла, и все работало отлично: что это за запуск в качестве службы?

4b9b3361

Ответ 1

Как уже намекнул мой предыдущий комментарий. Я думаю, что простой ответ невозможен. Чтобы реализовать связь между jconsole/jvisualvm и процессом мониторинга, Java использует файлы с отображением памяти. В конце концов, это сводится к определенному вызову API Windows, который терпит неудачу из-за функции "Ускорение Windows" [1], добавленной в Windows Vista и которая, конечно же, также существует в Windows 7 и более поздних версиях.

Вызов, который терпит неудачу, относится к функции OpenFileMapping, как видно из строки 1402 perfMemory_windows.cpp [2]. Во время моих экспериментов метод вызывается с аргументом формы "hsperfdata_ [username] _ [process id]". Как подробнее описано в Microsoft объяснения различий, вызванных упрощением службы (см. [3]), связь не будет работать, если не используется префикс имени: "Если пользовательское приложение [...] синхронизируется с сервисом путем создания или открытия объектов с префиксом" Локальный "(или без префикса, который по умолчанию является" Локальным "), приложение перестает работать так, как ожидалось".

Если кто-то хочет взглянуть сам. Вы можете использовать инструмент Logger [4], включенный в инструменты отладки Windows, для отслеживания вызовов API.

Также Sysinternals Process Explorer очень удобен, так как он показывает полные имена, используемые для файлов с отображением памяти через функцию "Найти ручку или DLL...". Просто найдите ручки, содержащие "hsperf".

В качестве побочного примечания: обходной путь для удаления или использования в другом временном каталоге, который содержит данные hsperf, сводится к тому, что случай имени пользователя, используемого процессом мониторинга и процессом мониторинга, должен быть последовательным, Но вместо изменения временного каталога вы также можете легко изменить переменную среды USERNAME, используемую процессом мониторинга. Вы также можете увидеть, как он используется в строке perfmemory_windows.cpp 272 [2].

[1] http://technet.microsoft.com/en-us/library/cc507844.aspx#EHF

[2] http://hg.openjdk.java.net/jdk7/hotspot-rt/hotspot/file/5dce25362b8a/src/os/windows/vm/perfMemory_windows.cpp

[3] http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx

[4] http://msdn.microsoft.com/en-us/library/windows/hardware/ff560123(v=vs.85).aspx

Ответ 2

Вы почти сделали это. Вместо того, чтобы работать как служба, я запускал Tomcat с использованием командного файла, и все отлично работало: что это за запуск в качестве службы? Теперь единственным шагом было запустить JVisualVM как службу:)

Обратитесь к этому

https://blogs.oracle.com/nbprofiler/entry/monitoring_java_processes_running_as

Поскольку только профилируются только процессы Java, работающие под тем же именем, что и VisualVM, единственный способ профилировать службу Windows (которая по умолчанию работает под учетной записью системы) - это запустить VisualVM в качестве службы Windows. Обратите внимание, что этот подход не работает в Windows Vista из-за ограничений безопасности, которые по умолчанию запрещают службам отображать любой пользовательский интерфейс.

Другим вариантом является запуск для запуска CMD.EXE в качестве локальной системы, см. ниже.

http://vicevoice.blogspot.in/2009/09/vaas-visualvm-as-service.html

Ответ 3

Не можете ли вы просто подключиться по сети, то есть запустить JVM с помощью

 java 
  -Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=1234 
  -Dcom.sun.management.jmxremote.local.only=false 
  -Dcom.sun.management.jmxremote.authenticate=false 
  -Dcom.sun.management.jmxremote.ssl=false 
  -jar my.jar`

и создайте сетевое соединение в инструменте на localhost: 1234

Ответ 4

Мне также было бы любопытно, есть ли у кого-нибудь решение в Windows 7. Как было отмечено, трюк запуска VisualVM как службы не работает на Vista, и я предполагаю, что те же функции безопасности мешают ему работать Выиграйте 7.

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