Как подключиться к инструменту командной строки Java с помощью YourKit Java Profiler? - PullRequest
3 голосов
/ 02 апреля 2010

Я создал инструмент командной строки на Java, который теперь хотел бы профилировать с помощью YourKit. Я запускаю инструмент командной строки с чем-то вроде:

$ java -classpath .:foo.bar.jar com.foobar.tools.TheTool arg1 arg2 arg3

Выполняется до завершения менее чем за 2 секунды.

После прочтения http://www.yourkit.com/docs/80/help/agent.jsp, я попробовал следующее:

$ java -agentpath:/home/dspitzer/yjp-8.0.24/bin/linux-x86-32/libyjpagent.so -classpath .:foo.bar.jar com.foobar.tools.TheTool arg1 arg2 arg3

... и я получаю:

[YourKit Java Profiler 8.0.24] JVMTI version 3001016d; 14.3-b01; Sun Microsystems Inc.; mixed mode, sharing; Linux; 32-bit JVM
[YourKit Java Profiler 8.0.24] Profiler agent is listening on port 10001...
[YourKit Java Profiler 8.0.24] *** HINT ***: To get profiling results, connect to the application from the profiler UI
...

(А затем инструмент запускается до завершения и выходит.)

Я думаю (по умолчанию, по крайней мере), YourKit предназначен для подключения только к запущенному приложению.

Как мне изменить мой инструмент командной строки, чтобы разрешить соединение с YourKit?

  1. Я мог бы добавить параметр командной строки у него будет пауза для ввода, и я не буду нажимать возврат для этого продолжать, пока я не подключился к нему от YourKit.
  2. Могу ли я использовать YourKit API? добавить в мой инструмент, который вызвал бы его заблокировать, пока я не соединился с YourKit
  3. Есть ли YourKit API или Java опция командной строки, которая будет создать профилирующий «снимок», который я мог загрузить и проанализировать позже (после инструмент командной строки завершен) с YourKit?

Ответы [ 5 ]

5 голосов
/ 02 апреля 2010

Нет возможности приостановить профилированное приложение до профилировщика «подключает»; вам просто не нужно этого делать.

Вместо этого, пожалуйста, сделайте следующее:

  • Включите требуемые режимы профилирования при запуске. Например, если вы необходимо профилировать использование процессора, запустить выборку процессора или трассировку процессора с соответствующими параметрами запуска «выборка» или «отслеживание». Смотри http://www.yourkit.com/docs/80/help/additional_agent_options.jsp

  • Если профилированное приложение работает недолго, включите захват снимков на выйти с параметром запуска "onexit = snapshot". Позже открытый захватили снимок в профилировщике для анализа.

2 голосов
/ 02 апреля 2010

Мне не известен вариант YourKit для этого (что не означает, что его нет), но - это опция удаленной отладки Java для этого.

Попробуйте добавить в командную строку следующее, в дополнение к параметрам агента YourKit:

-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y

Это должно привести к тому, что виртуальная машина приостанавливается при запуске, ожидая подключения отладчика через порт 8000. Сам по себе YourKit не является отладчиком, а IDE, например Eclipse или Netbean, будет выполнять эту работу, как базовая jdb командная строка.

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

Было бы лучше сделать все это с помощью YourKit, но я не знаю, как это сделать.

1 голос
/ 02 апреля 2010

Опция oneKit = снимок в YourKit сохраняет файл снимка в $ HOME / Snapshots при выходе из JVM. Вы можете загрузить этот снимок в графический интерфейс YourKit для последующего анализа. См. эту страницу на их веб-сайте для получения более подробной информации.

1 голос
/ 02 апреля 2010

Вы можете запустить его через Eclipse, который имеет плагин YourKit, который запускается при запуске приложения.

0 голосов
/ 02 апреля 2010

Ответ на вопрос № 3 - да, есть API, который вы можете использовать, чтобы ваше приложение дало результаты профилирования, которые затем может проверить YourKit.

Посмотрите API документы , а также инструмент командной строки для управления профилированием

Вот пример использования API (я не пробовал этот код):

Controller ykController = new Controller();
ykController.enableStackTelemetry();
ykController.enableExceptionTelemetry();
ykController.startCPUProfiling(ProfilingModes.CPU_TRACING,Controller.DEFAULT_FILTERS);
ykController.startAllocationRecording(false,0,false,0);
YourMainClass.main(args);
String snapshotLocation = ykController.captureMemorySnapshot();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...