Это очень яркий пример смещения безопасной точки.
Ниже 3 графиков пламени для слегка модифицированной версии вашего кода ( см. На github ).
Использование выборки SJK ![Sampling with SJK](https://i.stack.imgur.com/AZ4MP.png)
SJK использует подход выборки дампа потока, поэтому результат искажается на безопасную точку смещение.
Использование Java Flight Recorder ![enter image description here](https://i.stack.imgur.com/juXtN.png)
На JFR не влияет смещение безопасной точки при выборке, но карта символов, сгенерированная компилятором JIT, ограничена проверками безопасной точки по умолчанию.Это отрицательно сказывается на восстановлении следов стека.
Хотя результаты лучше, чем выборка дампа потока, вы можете увидеть аномалии.Например, Integer.toHexString
время определенно преувеличено.
Использование Java Flight Recorder и дополнительных опций JVM
-XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints
![enter image description here](https://i.stack.imgur.com/qQhIm.png)
Эта настройка параметров запуска JVM становится более точной и подробной.-XX:+DebugNonSafepoints
заставляет JIT-компилятор генерировать подробные карты символов.
Судя по этому примеру, вы можете прийти к выводу, что Java Flight Recorder универсально лучше.
Здесь вы можете найтиболее подробное объяснение этого явления.