Как отключить оптимизацию кадров стека 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 для ответа на этот вопрос.