原理
火焰图
参考文章
火焰图的原理可以参考:如何读懂火焰图?
工具
async-profiler
命令
- -e
指定要分析的事件类型, type可以为:- cpu 分析CPU使用情况,这是最常用的选项之一,用来找出哪些方法或代码路径占用了最多的CPU时间。
- alloc 分析内存分配情况,帮助你找出哪些方法分配了最多的内存。
- lock 分析锁竞争,找出哪些线程或代码路径在争夺锁,从而导致性能瓶颈。
- wall 分析实际的墙上时间(Wall-clock time),可以包括线程阻塞和等待时间。这在分析多线程应用程序时非常有用。
# 分析一个 Java 应用程序的CPU使用情况并生成火焰图
./profiler.sh -e cpu -o flamegraph -f flamegraph.svg <PID>
- -d :
指定分析持续时间,单位为秒。
./profiler.sh -d 30 -e cpu -f profile.html <PID>
#这将在 30 秒内捕获 CPU 事件。
- -f :
指定输出文件的路径和名称。
./profiler.sh -e cpu -f cpu-profile.html <PID>
- -i :
设置采样间隔,默认为 1000000 纳秒(1 毫秒)。
./profiler.sh -e cpu -i 500000 -f profile.html <PID>
#这将以 0.5 毫秒的间隔采样 CPU 事件。
- -t:
记录线程级别的调用栈,默认只记录应用级别的调用栈。
./profiler.sh -e cpu -t -f thread-profile.html <PID>
- -b :
设置内核缓冲区的大小,单位为KB,默认为 8192 KB。
./profiler.sh -e cpu -b 16384 -f profile.html <PID>
#这将缓冲区大小设置为 16384 KB。
- -j :
设置 Java 堆栈的最大深度,默认为 2048。
./profiler.sh -e cpu -j 4096 -f profile.html <PID>
- -v:
打印详细的调试信息,用于诊断 async-profiler 运行过程中的问题。
./profiler.sh -e cpu -v -f profile.html <PID>
- -I :
仅包含与指定模式匹配的堆栈,支持正则表达式。
./profiler.sh -e cpu -I 'java/util/.*' -f profile.html <PID>
# 这只会采样匹配 java/util/ 的堆栈。
- -x :
排除与指定模式匹配的堆栈,支持正则表达式。
./profiler.sh -e cpu -x 'sun/.*' -f profile.html <PID>
# 这将排除 sun/ 类的堆栈。
- –all-user:
分析所有用户代码,而不仅仅是当前用户的代码。
./profiler.sh -e cpu --all-user -f profile.html <PID>