Как отключить оптимизацию кадров стека Java или стеки профилей с использованием профилей системы?

Профилировщики системы, такие как DTrace и Linux perf_events, могут отслеживать трассировки стека из JVM. Теперь, символы в стороне (что еще одна проблема), и DTrace, и perf_events собирают много стеков, которые всего 1 кадр. Это частичные, неполные стеки.

Я пробовал DTrace jstack() и Linux perf_events с разворачиванием фрейма и карликом фреймов.

Я считаю, что это связано с тем, что hotspot компилирует оптимизированные кадры. Есть ли способ отключить эту оптимизацию, чтобы работали стандартные профилиры системы (например, Solaris DTrace и Linux perf)?

Я уже пробовал следующие параметры: -XX: + DeoptimizeRandom -XX: MaxInlineSize = 0 -XX: -OmitStackTraceInFastThrow -XX: + UnlockDiagnosticVMOptions -XX: + ShowHiddenFrames

Ответ 1

Это проблема с JVM и лучше всего описывается ошибкой:

https://bugs.openjdk.java.net/browse/JDK-6276264

В то время как это описывает проблему с DTrace jstack(), я считаю, что та же оптимизация (с использованием указателя фрейма как реестра) разбивает perf_events.

Это может быть исправлено в JDK 9. См.:

http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2014-June/014842.html

Благодаря разработчикам hotspot для ответа на этот вопрос.