Профилирование всего выполнения Java-программы в VisualVM - PullRequest
31 голосов
/ 17 августа 2011

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

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

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

Ответы [ 4 ]

20 голосов
/ 18 августа 2011

Попробуйте использовать 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.

11 голосов
/ 18 августа 2011

Лучший способ решить эту проблему без изменения вашего приложения - вообще не использовать VisualVM. Что касается других бесплатных опций, вы можете использовать либо Eclipse TPTP , либо Netbeans profiler , либо все, что поставляется с вашей 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) не позволяет настраивать профилировщики на приостановленный процесс, поскольку он просто не отображает вкладку Профилировщик.

3 голосов
/ 24 февраля 2014

Теперь это возможно с плагином профилировщика запуска для VisualVM.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...