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