Как JFR удается записывать трассировку стека, учитывая его обещания низких издержек? - PullRequest
2 голосов
/ 01 ноября 2019

Проходя https://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-wp-2008279.pdf, Я столкнулся со следующей цитатой:

Большинство технологий, используемых сегодня для мониторинга, управления и профилирования среды выполнения Java, используют довольно навязчивые технологии, такие как инструментарий байт-кодаи JVMTI.

, что заставило меня задуматься о том, как JFR использует стек сэмплирования.

Самым близким, что я смог найти в Интернете для ответа, было это сообщение в блоге: http://psy -lob-saw.blogspot.com / 2016/06 / the-pros-and-cons-of-agct.html с упоминанием того, что такие профилировщики, как Honest profiler и async-profiler, используют не оченьзадокументировано AsyncGetCallTrace, но дело в том, что в нем не упоминается конкретный способ, с помощью которого JFR осуществляет выборку / запись стековой трассировки.

Кто-нибудь здесь имеет какое-либо представление о внутренностях JFR по этой теме?

1 Ответ

3 голосов
/ 05 ноября 2019

JFR поддерживает поток, который периодически просыпается, то есть раз в 10 мс, и приостанавливает небольшое количество запущенных потоков Java, посылая сигнал. Затем он просматривает стеки приостановленных потоков, чтобы увидеть, какие методы выполнялись. Он вычисляет хеш фреймов стека и затем проверяет, была ли найдена эта трассировка стека ранее.

Если это не так, он добавляет кадры стека в хеш-таблицу и увеличивает счетчик, который становится идентификатором трассировки стека. Затем он генерирует идентификатор как событие Execution Sample, которое заканчивается буфером (без блокировки), который другой поток периодически сбрасывает на диск. Если идентификатор является новым, он также записывает полную трассировку стека, соответствующую этому идентификатору, поэтому трассировка стека может быть позднее обработана анализатором.

Если вы хотите копать глубже, вы можете посмотретьв исходном коде.

http://hg.openjdk.java.net/jdk/jdk/file/tip/src/hotspot/share/jfr/periodic/sampling

Способ приостановки потоков зависит от платформы. В следующем файле вы можете найти реализацию Linux.

http://hg.openjdk.java.net/jdk/jdk/file/tip/src/hotspot/os/linux/os_linux.cpp

...