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

Профиль Вся реализация Java-программы в VisualVM

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

Я попытался использовать опцию -Xrunjdwp, описанную в как профилировать запуск приложения с помощью visualvm, но между двумя способами транспорта (разделяемая память и сервер) ни один полезен для меня. VisualVM, похоже, не имеет интеграции с первым, и VisualVM отказывается подключаться к localhost или 127.0.0.1, поэтому последнее тоже не подходит. Я также попытался вставить простое чтение System.in в мою программу, чтобы вставить паузу в выполнение, но в этом случае VisualVM блокируется до тех пор, пока чтение не завершится, и не позволит начать профилирование до тех пор, пока выполнение не будет выполнено. Я также пробовал смотреть в плагин Eclipse, но веб-сайт полон мертвых ссылок, а запуск запускает только с NullPointerException когда я пытаюсь использовать его (это может быть более неточным).

Исходя из C, это не кажется мне особенно трудной задачей. Я просто что-то пропустил или это действительно невозможный запрос? Я открыт для любых предложений, включая использование другого (также бесплатного) профилировщика, и я не прочь от командной строки.

4b9b3361

Ответ 1

Рассмотрите возможность использования HPROF и открытия файла данных с помощью инструмента HPjmeter - или просто прочитав полученный текстовый файл в вашем любимом редакторе.

Command used: javac -J-agentlib:hprof=heap=sites Hello.java

SITES BEGIN (ordered by live bytes) Fri Oct 22 11:52:24 2004
          percent          live          alloc'ed  stack class  rank   self  accum     bytes objs     bytes  objs trace name
    1 44.73% 44.73%   1161280 14516  1161280 14516 302032 java.util.zip.ZipEntry
    2  8.95% 53.67%    232256 14516   232256 14516 302033 com.sun.tools.javac.util.List
    3  5.06% 58.74%    131504    2    131504     2 301029 com.sun.tools.javac.util.Name[]
    4  5.05% 63.79%    131088    1    131088     1 301030 byte[]
    5  5.05% 68.84%    131072    1    131072     1 301710 byte[]

HPROF способен отображать использование ЦП, статистику распределения кучи, и отслеживать профили конкуренции. Кроме того, он также может сообщать полные кучи и состояния всех мониторов и потоков в Виртуальная машина Java.

Ответ 2

Лучший способ решить эту проблему без изменения вашего приложения - вообще не использовать VisualVM. Что касается других бесплатных опций, вы можете использовать Eclipse TPTP или профилировщик Netbeans или что-то еще с вашей IDE.

Если вы можете изменить свое приложение, чтобы приостановить его при настройке профилировщика в VisualVM, это вполне возможно сделать, используя плагин VisualVM Eclipse. Я не уверен, почему вы получаете исключение NullPointerException, поскольку оно работает на моей рабочей станции. Вам нужно настроить плагин, указав путь к двоичному файлу jvisualvm и пути JDK; это делается путем посещения диалогового окна конфигурации VisualVM в Windows → Настройки → Запуск/Отладка → Запуск → Настройка VisualVM (как показано на следующем скриншоте).

Eclipse VisualVM plugin

Вам также необходимо настроить приложение для запуска с помощью пусковой установки VisualVM вместо запуска JDT по умолчанию.

Все запуски приложений из Eclipse теперь приводят к тому, что VisualVM автоматически отслеживает новую локальную JVM при условии, что VisualVM уже запущен. Если у вас нет запуска VisualVM, плагин запустит VisualVM, но он также продолжит работу с приложением.

Вывод из предыдущего предложения, очевидно, что использование приложения в методе main() до выполнения любой обработки весьма полезно. Но это не является основной причиной приостановки приложения. Видимо, VisualVM или его плагин Eclipse не позволяют автоматически запускать профилировщики процессора или памяти. Это означало бы, что эти профилировщики нужно будет запустить вручную, что потребует приостановки приложения.

Кроме того, стоит отметить, что добавление флагов: -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y к запуску JVM не поможет вам в случае VisualVM, приостанавливать приложение и настраивать профилировщики. Флаги призваны помочь вам в случае профилировщиков, которые могут фактически подключиться к открытому порту JVM, используя протокол JDWP. VisualVM не использует этот протокол, поэтому вам нужно будет подключиться к приложению с помощью JDB или удаленного отладчика; но это не решит проблему, связанную с конфигурацией профилировщика, поскольку VisualVM (по крайней мере, с обновлениями для Java 6 26) не позволяет вам настраивать профилировщики на приостановленном процессе, поскольку он просто не отображает вкладку Profiler.

Ответ 3

Совет с -Xrunjdwp неверен. Он просто позволяет отладчику, а с помощью suspend=y он ожидает подключения отладчика. Поскольку VisualVM не является отладчиком, это не поможет вам. Однако вставка System.in или Thread.sleep() приостанавливает запуск и позволяет VisualVM подключаться к вашему приложению. Обязательно прочитайте Профилирование с помощью VisualVM 1 и Профилирование с помощью VisualVM 2 чтобы лучше понять настройки профилировщика. Обратите также внимание на то, что вместо профилирования вы можете использовать вкладку "Sampler" в VisualVM, которая более подходит для профилирования всего выполнения Java-программы. Как упоминалось выше, вы также можете использовать Profiler NetBeans, который напрямую поддерживает профилирование запуска приложения.