火焰图有助于识别消耗最多 CPU 时间的执行路径。
简而言之,以下是生成火焰图的步骤
yum -y install perf
wget https://github.com/jvm-profiling-tools/async-profiler/releases/download/v1.8.3/async-profiler-1.8.3-linux-x64.tar.gz
tar -xvf async-profiler-1.8.3-linux-x64.tar.gz
chmod -R 777 async-profiler-1.8.3-linux-x64
cd async-profiler-1.8.3-linux-x64
echo 1 > /proc/sys/kernel/perf_event_paranoid
echo 0 > /proc/sys/kernel/kptr_restrict
JAVA_PID=`pgrep java`
./profiler.sh -d 30 $JAVA_PID -f flame-graph.svg
flame-graph.svg
也可以使用浏览器打开,简而言之,堆栈跟踪中元素的宽度指定了相对包含执行流的线程转储的数量。
生成它们的其他方法很少
- 通过引入此处
-XX:+PreserveFramePointer
描述的 JVM 选项
- 如此处
-XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints
所述使用 async-profiler
但是使用 async-profiler 而不提供任何选项虽然不是很准确,但可以在不更改正在运行的 Java 进程的情况下利用进程的 CPU 开销低。
他们的wiki提供了有关如何利用它的详细信息。更多关于火焰图的信息可以在这里找到