了解 perf.map
Understanding perf.map
我知道很棒的 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
是从哪里来的,为什么它会出现在顶部。
perf-<pid>.map
文件是一种提供 perf
特定于应用程序的符号映射的方法。
在您的例子中,其中一个采样指令指针 0x00000000008e06e0
属于 libjvm.so
- perf 可以很容易地显示这一点。但另一个 0x00007f557d10c19f
属于匿名内存区域,不受任何目标文件支持。这是动态生成的代码,除非有人提供帮助,否则 perf 无法提供任何相关信息。 perf-<pid>.map
文件是应用程序或外部工具为动态生成的代码提供符号信息的接口。
perf-map-agent 是 Java 的此类工具的示例。它使用有关 JIT 编译方法的信息填充 perf-<pid>.map
文件,以便 perf 可以将这些地址映射到 Java 方法名称。
我知道很棒的 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
是从哪里来的,为什么它会出现在顶部。
perf-<pid>.map
文件是一种提供 perf
特定于应用程序的符号映射的方法。
在您的例子中,其中一个采样指令指针 0x00000000008e06e0
属于 libjvm.so
- perf 可以很容易地显示这一点。但另一个 0x00007f557d10c19f
属于匿名内存区域,不受任何目标文件支持。这是动态生成的代码,除非有人提供帮助,否则 perf 无法提供任何相关信息。 perf-<pid>.map
文件是应用程序或外部工具为动态生成的代码提供符号信息的接口。
perf-map-agent 是 Java 的此类工具的示例。它使用有关 JIT 编译方法的信息填充 perf-<pid>.map
文件,以便 perf 可以将这些地址映射到 Java 方法名称。