Jconsole не может подключиться к процессам Java, работающим как Windows 7 Services - PullRequest
6 голосов
/ 12 января 2011

У нас есть процесс Java, который мы запускаем как сервис Windows (используя srvany).Он работает с Java 1.6 (1.6.0.23 на данный момент).

В прошлом (Windows XP) я мог подключить JConsole к процессам, в Windows 7 я больше не могу этого делать.

Если я запускаю jconsole <pid>, я получаю «Неверный идентификатор процесса:4488” .Службы работают от имени пользователя SYSTEM.

Если я запускаю службу от имени моего пользователя на рабочем столе (используя «Вход в систему как эта учетная запись»), идентификатор процесса служб появляется в JConsole, но они недоступны, и я не могуconnect.

Невозможно динамически подключаться к процессам Java, когда они выполняются как служба Windows 7?

Ответы [ 6 ]

3 голосов
/ 05 августа 2011

Возможно, это проблема 64-битного / 32-битного, у меня есть несколько приложений, скомпилированных с 32-битным JDK, которые не могут быть открыты с помощью JConsole из 64-битного JDK в Windows 7 64-битных, после того, как я скачал 32-битный JDK, он работал.

1 голос
/ 21 января 2011

Другие смогли запустить jstack на 2008r2 , что может дать некоторое представление о том, как подключить jconsole в Windows 7. Как вы отметили в своем комментарии, разрешения важны. Если служба и jconsole не могут получить доступ к временному каталогу для записи в соответствующий подкаталог hsperf, это не сработает. Важно также местоположение временного каталога, пользователя, на котором запущена служба, и пользователя, на котором работает jconsole.

Запуск SysInternals psexec -s -i <jdk_home>\bin\jconsole <PID> можно использовать для запуска jconsole от имени локальной системы, того же пользователя, которого, я полагаю, вы используете для запуска своей службы.

Мой опыт запуска jconsole из JDK 1.5 в Server 2008 в качестве системного пользователя был неудачным. С разрешениями, которые я считал достаточными, я получил ошибку Could Not Open PerfMemory. Java 1.6 может быть другой историей.

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

0 голосов
/ 11 июня 2019

Возможно, проблема с папкой %TMP%/hsperfdata_{USER_NAME}. В моем случае это сработало после того, как я:

  • закрыть все приложения, работающие на JVM
  • удалить папку %TMP%/hsperfdata_{USER_NAME} (пример: C:/Temp/hsperfdata_MyUser)
  • повторно открыть JConsole (он воссоздает папку)

Надеюсь, это поможет. Вы также можете взглянуть на эту тему в Oracle community .

0 голосов
/ 24 февраля 2017

Измените переменную среды TEMP и Tmp на другую созданную вами папку. Например, c: \ theTemp

0 голосов
/ 30 ноября 2015

Добавьте следующее в JAVA_OPTION

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=8086 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

Затем используйте JConsole для подключения к удаленному сеансу: localhost: 8086

0 голосов
/ 01 марта 2011

В настоящее время я сталкиваюсь с той же проблемой, но в Windows 2003 R2 (SP2).В базе данных Oracle Bug имеется ошибка открытия (идентификатор ошибки 6399729) http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6399729

Также в конце имеется сообщение об обходе.В нем говорится об установке Java в режиме «установки» :-), но у меня не получилось в Windows 2003.Но ваш пробег может варьироваться !!

...