如何使用系统探查器禁用 Java 堆栈帧优化或配置文件堆栈?

2022-09-04 22:44:05

系统分析器(如 DTrace 和 Linux perf_events)能够分析来自 JVM 的堆栈跟踪。现在,撇开符号(这是另一个问题)不谈,DTrace 和 perf_events收集许多只有 1 帧的堆栈。这些是部分、不完整的堆栈。

我尝试过DTrace jstack()和Linux perf_events,同时具有帧指针和矮堆栈展开。

我相信这是由于热点编译优化的帧。有没有办法禁用此优化,以便标准系统分析器(如 Solaris DTrace 和 Linux 性能)正常工作?

我已经尝试了以下选项: -XX:+DeoptimizeRandom -XX:MaxInlineSize=0 -XX:-OmitStackTraceInFastThrow -XX:+UnlockDiagnosticVMOptions -XX:+ShowHiddenFrames


答案 1

这是一个JVM问题,最好用bug来描述:

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

感谢热点开发人员回答这个问题。


答案 2

推荐