jvisualvm не перечисляет определенные процессы Java

Я хочу получить дамп кучи (подозрение на утечку памяти) определенного процесса Java. Однако, когда я запускаю инструмент jvisualvm, я не вижу ни одного из запущенных процессов Java.

Я погуглил об этом и уже нашел пару статей, в которых говорится, что вам нужно запускать процессы Java, используя тот же JDK, с которым вы запускаете инструмент jvisualvm, чтобы он мог их видеть. Однако, насколько я вижу, это уже так. Делаю все локально (имею удаленный доступ к машине).

Несколько вещей, которые следует учитывать:

  1. Процессы выполняются на защищенном брандмауэром сервере Windows 2008.
  2. Процессы выполняются с использованием переименованных версий исполняемого файла JDK java.exe.
  3. Насколько я вижу, процессы выполняются с использованием JDK 1.6.0_18.
  4. Один из запущенных процессов запускает реестр RMI

Я жду виртуализированную копию сервера, чтобы я мог с ней возиться (это рабочий сервер). А между тем; есть идеи, почему я не вижу ни одного из процессов в jvisualvm (или jconsole, если на то пошло)?


person tmbrggmn    schedule 17.02.2011    source источник
comment
Зачем переименовывать java.exe? Я почти уверен, что VisualVM получает список процессов, ища все процессы, на которых запущен java.exe.   -  person Gandalf    schedule 17.02.2011
comment
Вы не можете легко увидеть аргументы командной строки в Windows, поэтому в конечном итоге вы переименовываете/копируете java.exe, чтобы вы знали, какой процесс есть что.   -  person Peter Lawrey    schedule 17.02.2011
comment
jconsole и visualvm зависят от пользователя. Если процессы запущены от имени другого пользователя, вы не сможете их увидеть, но вы можете открыть систему безопасности, чтобы разрешить удаленное управление ими.   -  person Peter Lawrey    schedule 17.02.2011
comment
Спасибо за подсказку, может так оно и есть. Процессы запускаются с помощью службы Windows, поэтому они, вероятно, работают под какой-либо учетной записью службы Windows. А можно ссылки на статьи по этому поводу? Кроме того, не стесняйтесь предоставить это в качестве ответа, я одобрю его, если он правильный.   -  person tmbrggmn    schedule 17.02.2011
comment
@Peter, если вы хотите увидеть, что работает на компьютере с Windows, с полными аргументами командной строки, сокетами tcp/ip и т. д., тогда вам следует использовать обозреватель процессов sysinternals technet.microsoft.com/en-us/sysinternals/bb896653 похож на диспетчер задач на стероидах. Как разработчик, однажды попробовав его, вы всегда будете хотеть его использовать на любом компьютере с Windows, который вы используете. В наборе sysinternals также есть ряд других очень полезных инструментов, мне также нравится junction, который предоставляет настоящие unix-подобные символические ссылки для окон.   -  person crowne    schedule 17.02.2011


Ответы (2)


Что ж, после того, как я провел небольшое исследование, оказалось, что комментарий Питера был правильным. Поскольку процессы JVM были запущены другим пользователем (учетной записью NETWORK SERVICE, поскольку они запускались службой Windows), они не отображались в jvisualvm.

Обходной путь

Поскольку у меня есть доступ к конфигурации приложения, я нашел следующий обходной путь, который включает явное включение незащищенного JMX для целевой JVM:

  1. Добавьте следующие параметры JVM:

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

  2. Добавьте удаленный процесс в jvisualvm с помощью JMX, нажав Файл -> Добавить соединение JMX. Вы можете подключиться к процессу, используя порт 3333. Очевидно, вы можете изменить порт, если хотите.

Ссылка на статью с более подробным объяснением: http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/jmx_connections.html

Примечания

  1. Вероятно, не не рекомендуется постоянно сохранять настройки JVM, поскольку они позволят любому подключиться к JVM через JMX.
  2. Вы также можете добавить аутентификацию в параметры JMX JVM, если хотите.
person tmbrggmn    schedule 21.02.2011
comment
Спасибо! Именно то, что мне нужно было знать. - person Kevin Brotcke; 27.02.2013
comment
Да, +1. Я был озадачен этим навсегда. Это верно и для Linux? - person David Brossard; 23.01.2017
comment
@DavidBrossard Я полагаю, что это так, или, по крайней мере, существует аналогичный механизм для ограничения определенных служб, как это делает Windows. - person tmbrggmn; 03.02.2017

Самый простой способ — запустить jvisualvm от имени администратора (выиграть: «запустить от имени администратора»). Что не идеально, но работает. Тогда все java-процессы видны.

person Wooff    schedule 21.11.2017