Как подключиться к инструменту командной строки Java с помощью профилировщика Java YourKit?

StackOverflow https://stackoverflow.com/questions/2563777

Вопрос

Я создал инструмент командной строки на 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. Есть ли API yourkit, который я мог бы добавить в свой инструмент, который может заблокировать его, пока я не подключился к Yourkit?
  3. Есть ли вариант API Yourkit или вариант командной строки Java, которая создаст профилирующий «снимок», который я мог бы загрузить и проанализировать позже (после завершения инструмента командной строки) с помощью Yourkit?
Это было полезно?

Решение

Приостановить профилированное приложение невозможно до тех пор, пока не появится профилировщик «соединяет»;вам просто не нужно этого делать.

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

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

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

Другие советы

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

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

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

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

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

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

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

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

Ответ на вопрос №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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top