我知道很棒的async_profiler工具,我用它来分析我的生产项目。这里我想了解一下perf
以及如何理解它的输出。
我正在尝试使用 perf 来对堆栈跟踪进行采样。我使用选项运行 JVM -XX:+UnlockDiagnosticVMOptions -XX:+PreserveFramePointer -XX:+ShowHiddenFrames
以避免堆栈跟踪困惑。
我用命令 sudo perf record -e cycles -g -p <my_pid>
运行它为了对用户和内核堆栈跟踪进行采样并比较结果百分比。这是我得到的:
start_thread
符号对我来说似乎很清楚。他们来自 libjvm.so
我可以假设我运行了 3 个工作线程来完成一些工作,这正是我在这里看到的。十六进制数字似乎是运行时编译的 java 代码指令地址。
问题: 但是 perf-27405.map
在哪里?来自以及为什么它出现在顶部。
最佳答案
perf-<pid>.map
file 是一种提供 perf
的方式带有特定于应用程序的符号映射。
在您的例子中,采样指令指针之一 0x00000000008e06e0
属于libjvm.so
- perf 可以很容易地显示这一点。但是另一个0x00007f557d10c19f
属于不受任何目标文件支持的匿名内存区域。这是动态生成的代码,除非有人提供帮助,否则 perf 无法提供任何相关信息。 perf-<pid>.map
文件是应用程序或外部工具为动态生成的代码提供符号信息的接口(interface)。
perf-map-agent是此类 Java 工具的示例。它填充 perf-<pid>.map
包含有关 JIT 编译方法的信息的文件,以便 perf 可以将这些地址映射到 Java 方法名称。
关于java - 理解 perf.map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52392319/