我知道一个很好的async_profiler工具,我用它来对我的生产项目进行性能分析。这里我想了解一下
我正在使用perf对堆栈跟踪进行采样。我使用以下选项运行JVM:
我使用命令
perf
以及如何理解其输出。我正在使用perf对堆栈跟踪进行采样。我使用以下选项运行JVM:
-XX:+UnlockDiagnosticVMOptions -XX:+PreserveFramePointer -XX:+ShowHiddenFrames
,以避免堆栈跟踪出现问题。我使用命令
sudo perf record -e cycles -g -p <my_pid>
运行它,以便同时采样用户和内核堆栈跟踪,并比较结果百分比。这是我得到的结果:
start_thread
符号对我来说似乎很清楚。它们来自于libjvm.so
,我可以假设我运行了3个Worker线程来完成某些工作,这正是我在这里看到的。十六进制数字似乎是运行时编译的Java代码指令地址。
问题:但是perf-27405.map
从哪里来的,为什么它出现在顶部?
libjvm.so
下的所有指令指针实际上并不是我用 Java 编写的 JIT 方法,而是实际的运行时代码。 - St.Antariolibjvm.so
指令都带有可读性强的标签。我是否需要自己编译带有调试符号的JVM? - St.Antario