Получить дамп кучи из удаленного приложения на Java с помощью JVisualVM

Я запускаю JVisualVM (Windows XP, Sun Java 1.6.0.13, 32-разрядная клиентская виртуальная машина) для мониторинга удаленного приложения (Linux, Sun Java 1.6.0.07, 64-разрядная серверная виртуальная машина). Перед запуском фактического удаленного приложения я запускаю его на удаленной машине jstatd, используя политику полного доступа:

grant codebase "file:${java.home}/../lib/tools.jar" {
   permission java.security.AllPermission;
};

Затем я запускаю настоящее приложение с помощью командной строки.

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

С клиентской машины я могу видеть удаленное приложение и отслеживать его. Я также могу сделать дамп потока и т. д. К сожалению, кнопка дампа кучи неактивна.

Как я могу получить дамп кучи из удаленно контролируемого приложения с помощью JVisualVM?

Я пытался использовать jConsole. С помощью jConsole можно создать удаленный дамп кучи с помощью операции com.sun.management.HotSpotDiagnostic dumpHeap. Я хочу, чтобы дамп был передан на сторону клиента и проанализирован с помощью инструментов, предоставляемых JVisualVM. Как я могу это сделать?


person Philipp    schedule 07.04.2009    source источник
comment
запуск jvisualvm от имени того же пользователя, который запускает процесс Java, может помочь   -  person rogerdpack    schedule 02.10.2012
comment
@rogerdpack хорошее замечание! Я перешел к этому вопросу/теме, так как у меня тот же вопрос, что и у stackoverflow.com/questions/8799929/, и я думаю, что ваше утверждение/предположение верно. Когда я запускаю tomcat/tomee через мою среду IDE NetBeans на моем ПК/сервере разработчика, кнопка Sampler›Memory активна, но кнопка Sampler›Memory отключена на производственном сервере, поскольку tomcat/tomee работает как служба Windows, и я Я «не» вошел в производственную службу как системную или локальную службу. :(   -  person Howard    schedule 06.04.2013


Ответы (4)


Есть способ сделать это!

  1. rmiregistry -J-Xbootclasspath/p:$JAVA_HOME/lib/sa-jdi.jar (используется порт 1099)
  2. запустите «jsadebugd» на машине, на которой запущено приложение: jsadebugd & (pid JVM)
  3. На удаленной машине используйте следующий jmap -dump:file=:1099

  4. Джат

Приведенное выше запустит веб-приложение на порту 7000.

Все вышеперечисленные инструменты являются частью JDK 1.6.

Всего наилучшего!

person Community    schedule 06.05.2009
comment
приведет ли это к снижению производительности работающего приложения? возможно, это не имеет значения. - person Will Glass; 23.07.2009

К сожалению, нет автоматизированного способа сделать это. Вам нужно будет запустить jmap вручную на сервере Linux, чтобы сбросить кучу вашей JVM, а затем скопировать полученный дамп кучи на локальный компьютер с JVisualVM и использовать File|Load... для загрузки дампа кучи в JVisualVM для анализа.

person Yeroc    schedule 01.05.2009

Начиная с версии 1.3, VisualVM поддерживает удаленные дампы кучи:

Начиная с VisualVM 1.3, теперь вы можете использовать действия и кнопки Heap Dump в инструменте для создания дампа кучи приложений, работающих удаленно. При вызове отображается диалоговое окно, позволяющее указать полный путь в удаленной системе, где вы хотите создать дамп кучи. После создания дампа кучи необходимо вручную скопировать файл на локальный компьютер и использовать действие «Загрузить», чтобы открыть и проанализировать файл с помощью VisualVM.

См.: Выпуск VisualVM 1.3

person Ko-Chih Wu    schedule 02.04.2012

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

person Ichorus    schedule 24.04.2009