我知道了出色的async_profiler工具,并使用它来对生产项目进行性能分析。在这里,我想了解perf
以及如何理解其输出。
我在玩perf来采样堆栈跟踪。我使用选项-XX:+UnlockDiagnosticVMOptions -XX:+PreserveFramePointer -XX:+ShowHiddenFrames
运行JVM以避免堆栈跟踪混乱。
我使用命令sudo perf record -e cycles -g -p <my_pid>
来运行它,以便为两个用户采样内核堆栈跟踪并比较结果百分比。这是我得到的:
start_thread
符号对我来说似乎很清楚。它们来自libjvm.so
,我可以假设我运行了3个工作线程来完成某些工作,而这正是我在这里看到的。十六进制数字似乎是运行时编译的Java代码指令地址。
问题: 但是perf-27405.map
来自哪里以及为什么出现在顶部。
答案 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方法名称。