St.*_*rio 4 java linux jvm perf
我知道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文件是一种提供perf特定于应用程序的符号映射的方法。
在您的情况下,采样指令指针之一0x00000000008e06e0属于libjvm.so- perf 可以轻松地显示这一点。但另一个0x00007f557d10c19f属于匿名内存区域,不受任何目标文件支持。这是动态生成的代码,除非有人帮忙,否则 perf 无法透露任何信息。perf-<pid>.map文件是应用程序或外部工具的接口,为动态生成的代码提供符号信息。
perf-map-agent是此类 Java 工具的一个示例。它perf-<pid>.map用有关 JIT 编译方法的信息填充文件,以便 perf 可以将这些地址映射到 Java 方法名称。