java - 如何禁用 Java 堆栈帧优化或使用系统分析器分析堆栈?

标签 java linux jvm jvm-hotspot dtrace

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

我已经尝试过 DTrace jstack() 和 Linux perf_events 以及帧指针和 dwarf 堆栈展开。

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

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

最佳答案

这是一个 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

感谢热点开发者的解答

关于java - 如何禁用 Java 堆栈帧优化或使用系统分析器分析堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071792/

相关文章:

linux - 使用 stat_code : 20, io 记录服务器获取错误 :3 while Setting up agora.

Python 多处理 linux windows 区别

java - 如何判断OpenJDK是否安装了调试符号

java - 跨多个 JVM 的 Jamon 统计聚合

java - 如何为具有 Java Spring 安全性的用户授予权限

java - 在 Java 数据库中执行基于 boolean 值的方法的好的设计是什么?

c - 不同的行为取决于架构

java - 如何获取我的java应用程序正在使用的最大堆大小?

java - 在ddd实践中,CRUD方法是否应该放在Model Objects中

Java setOnAction 订阅抛出异常的事件