Слушатель управления полетами Java?

В настоящее время у меня есть некоторый код Java, который я хотел бы профилировать. Я решил использовать Java Mission Control после прочтения некоторых многообещающих вещей об этом. Тем не менее, каждый ресурс, с которым я ознакомился до сих пор, говорит мне, что сначала нужно сначала запустить процесс, который я хочу профилировать, и только потом "прикреплять" или профилировать код из Mission Control, когда он уже запущен (например, это видео из oracle: https://youtu.be/WMEpRUgp9Y4?t=14m56s).

Есть ли способ начать процесс с профилирования с самого начала? Спасибо

3 ответа

Это не очень хорошо задокументировано, но есть возможность. Вы должны использовать эту опцию JVM

-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=

Первые два являются обязательными, в то время как последний должен быть настроен с различными параметрами, которые вы можете найти здесь. Не просто понять значение каждого параметра, но с помощью проб и ошибок вы можете легко найти хороший набор параметров.

Так же, как ссылка, это минимальная функциональная конфигурация:

java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true,disk=true,repository=/tmp,maxage=6h,settings=default MyApp

Существует способ начать запись профилирования при запуске процесса.

Пример: запуск записи профилирования в течение 10 минут.

java -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=10m,name=Test,filename=recording.jfr,settings=profile -jar target/highcpu-0.0.1.jar

Смотрите мою статью для более подробной информации: Использование Java Flight Recorder

JDK 11:

-XX:StartFlightRecording

JDK 9, JDK 10:

-XX:+UnlockCommercialFeatures
-XX:StartFlightRecording

JDK 8u40,

-XX:+UnlockCommercialFeatures
-XX:StartFlightRecording=name=whatever

JDK 7u4, JDK 8u20:

-XX:+UnlockCommercialFeatures 
-XX:+FlightRecorder 
-XX:StartFlightRecording=name=whatever

Если вы хотите избежать присоединения к процессу все вместе, вы можете указать имя файла, то есть -XX:StartFlightRecording=filename=rec.jfr, а затем либо вывести запись после периода, установив длительность, т.е. длительность =60 с, либо если вы хотите, чтобы это произошло только при выходе из JVM:

 -XX:StartFlightRecording=
 filename=rec.jfr,dumponexit=true

Вы можете открыть, а затем открыть файл записи в JMC. В JDK 11 это еще больше упростилось, поэтому вам нужно только указать:

 -XX:StartFlightRecording:filename=c:\recs

имя файла будет сгенерировано в указанном каталоге, и оно будет автоматически выгружаться при выходе из JVM.

Другие вопросы по тегам