async-profiler配合火焰图是定位Java性能瓶颈最轻量准确的方式,支持生产环境低开销采样,可区分CPU计算、I/O等待与锁竞争,并能结合jstack交叉验证线程真实状态。
直接用 async-profiler 配合火焰图,是目前最轻量、最准确的定位方式。它不依赖JVM调试接口,能同时抓到Java代码和底层系统调用,生产环境也能低开销运行。
async-profiler 依赖 Linux 的 perf_events,需提前开放内核权限:
sudo sysctl kernel.perf_event_paranoid=1(允许非root进程使用perf)sudo sysctl kernel.kptr_restrict=0(暴露内核符号,便于解析调用栈)--cap-add=SYS_ADMIN 并挂载 /proc:/proc:ro
对目标Java进程(PID已知)执行10秒CPU采样:
/path/to/profiler.sh -e cpu -d 10 -f /tmp/cpu-flame.html <pid>/tmp/cpu-flame.html
CPU火焰图可能显示大量线程停在 read、epoll_wait 或 pthread_cond_wait —— 这不是计算瓶颈,而是I/O或锁阻塞:
立即学习“Java免费学习笔记(深入)”;
java.net.SocketInputStream.socketRead0,优先查网络延迟或下游响应慢Unsafe.park,配合 jstack <pid> 看是否在等待锁或线程池满-e lock 查锁竞争,或 -e alloc 查对象分配压力当火焰图指出某方法耗时高,但不确定是否真在执行,可用jstack辅助判断:
jstack <pid> > stack.log 导出当前所有线程栈RUNNABLE(真正在跑)还是 WAITING/BLOCKED(实际被卡住)String.substring 占比高,但jstack显示该线程多数时间在 Object.wait,说明问题不在substring本身,而在上游同步控制逻辑