java - 理解 perf.map

标签 java linux jvm perf

我知道很棒的async_profiler工具,我用它来分析我的生产项目。这里我想了解一下perf以及如何理解它的输出。

我正在尝试使用 perf 来对堆栈跟踪进行采样。我使用选项运行 JVM -XX:+UnlockDiagnosticVMOptions -XX:+PreserveFramePointer -XX:+ShowHiddenFrames以避免堆栈跟踪困惑。

我用命令 sudo perf record -e cycles -g -p <my_pid> 运行它为了对用户和内核堆栈跟踪进行采样并比较结果百分比。这是我得到的:

enter image description here

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/

相关文章:

java - Restful Web 服务中的属性文件

linux - 在linux中获取CLOCK_TICK_RATE值

c - 我的线程图像生成应用程序如何将其数据获取到 gui?

Linux 比较两个文本文件

java - 接近空的 Java For-Loop 行为异常

java - 检查您的模块类路径是否存在缺失或冲突的依赖项

java - 如何使用 throws 处理运行时错误

java - 在 if 语句中读取字符串时遇到问题

java - Groovy:什么是 java stream anyMatch 的模拟

Java 垃圾收集器时间限制