Как профилировать количество сгенерированных исключений, классифицированных по классу исключений или строке кода

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

Как я могу отследить, какой тип исключения генерируется и где в исходном коде оно возникает, чтобы я мог увидеть, могу ли я исправить сторонний код самостоятельно?

Насколько я вижу, Java Mission Control не показывает никакой разбивки по типам или источникам исключений.

Пожалуйста, не рекомендуйте дорогие коммерческие профилировщики, так как это проект с открытым исходным кодом.


person Andrew Parks    schedule 10.02.2020    source источник


Ответы (2)


Насколько я вижу, Java Mission Control не показывает никакой разбивки по типам или источникам исключений.

Это неверно, Java Mission Control предоставляет эту информацию.

Сначала нужно включить трассировку исключений в Flight Recorder (по умолчанию трассируются только потомки java.lang.Error).

См. скриншот настроек бортового самописца ниже.

Параметры бортового самописца

После записи вам нужно перейти к отчету «Исключения».

Там вы найдете разбивку исключений по классам. Представление «Трассировка стека» позволит получить точную трассировку стека.

Управление полетами

Небольшой хак JMC live: откройте контекстное меню в представлении «Трассировка стека» и выберите «Различать кадры по» > «Номер строки» (см. на скриншоте выше). Это позволит вам видеть номера строк.

Если вы предпочитаете инструменты CLI, взгляните на SJK (отказ от ответственности, это мой собственный профилировщик OSS) . Например. приведенная ниже команда создаст SVG-график исключений из дампа JFR. Есть также несколько других типов отчетов.

java -jar sjk.jar ssa -f dump.jfr --jfr-event THROW --flame > throw_flame.svg
person Alexey Ragozin    schedule 10.02.2020
comment
Спасибо, отличный ответ. Я использую коллекцию командной строки, и похоже, что мне нужно установить для параметра jdk.JavaExceptionThrow значение true. - person Andrew Parks; 10.02.2020
comment
Просто примечание об использовании командной строки: вам нужно создать новый файл настроек для JFR, аналогичный тем, которые включены в JDK (по умолчанию и профиль). Вы можете либо сделать это с помощью JMC и экспортировать файл, либо скопировать JDK/lib/jfr/profile.jfc и изменить jdk.JavaExceptionThrow#enabled на true. Затем запустите приложение с помощью -XX:StartFlightRecording=settings=<path to the new file>...... - person Klara; 11.02.2020

Пожалуйста, не рекомендуйте дорогие коммерческие профилировщики, так как это проект с открытым исходным кодом.

Некоторые коммерческие профилировщики предлагают бесплатные лицензии для проектов с открытым исходным кодом, например JProfiler. .

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

введите здесь описание изображения

Отказ от ответственности: моя компания разрабатывает JProfiler.

person Ingo Kegel    schedule 10.02.2020
comment
Просто обратите внимание, что с Java 11 JFR больше не является коммерческой функцией :) - person Klara; 11.02.2020
comment
Также обратите внимание, что начиная с версии JMC 7 исходный код JMC является частью OpenJDK с открытым исходным кодом. А начиная с версии JMC 8 исходный код JMC доступен на GitHub: github.com/openjdk/jmc. - person Hirt; 11.02.2020
comment
Да, это правильно, мое замечание касалось JProfiler, который является коммерческим профилировщиком. Кстати, с версии 11.1 JProfiler может открывать моментальные снимки JFR. - person Ingo Kegel; 11.02.2020