了解perf.map

时间:2018-09-18 18:06:12

标签: java linux jvm perf

我知道了出色的async_profiler工具,并使用它来对生产项目进行性能分析。在这里,我想了解perf以及如何理解其输出。

我在玩perf来采样堆栈跟踪。我使用选项-XX:+UnlockDiagnosticVMOptions -XX:+PreserveFramePointer -XX:+ShowHiddenFrames运行JVM以避免堆栈跟踪混乱。

我使用命令sudo perf record -e cycles -g -p <my_pid>来运行它,以便为两个用户采样内核堆栈跟踪并比较结果百分比。这是我得到的:

enter image description here

start_thread符号对我来说似乎很清楚。它们来自libjvm.so,我可以假设我运行了3个工作线程来完成某些工作,而这正是我在这里看到的。十六进制数字似乎是运行时编译的Java代码指令地址。

问题: 但是perf-27405.map来自哪里以及为什么出现在顶部。

1 个答案:

答案 0 :(得分:3)

perf-<pid>.map文件是一种为perf提供特定于应用程序的符号图的方法。

在您的情况下,采样指令指针0x00000000008e06e0之一属于libjvm.so-perf可以很容易地显示这一点。但是另一个0x00007f557d10c19f属于匿名存储区域,没有任何目标文件支持。这是动态生成的代码,除非有人帮助,否则perf不能告诉任何有关它的信息。 perf-<pid>.map文件是应用程序或外部工具的接口,用于为动态生成的代码提供符号信息。

perf-map-agent是此类Java工具的示例。它将有关JIT编译方法的信息填充到perf-<pid>.map文件中,以便perf可以将这些地址映射到Java方法名称。