资讯动态

async-profiler:基于 AsyncGetCallTrace 与 perf_events 的 Java 低开销采样剖析器使用与构建指南

发布时间:2026/9/16 14:29:18 来源:尧图企业网站定制
async-profiler基于 AsyncGetCallTrace 与 perf_events 的 Java 低开销采样剖析器使用与构建指南【免费下载链接】async-profilerSampling CPU and HEAP profiler for Java featuring AsyncGetCallTrace perf_events项目地址: https://gitcode.com/GitHub_Trending/as/async-profilerasync-profiler 是一款专为 Java 设计的低开销采样剖析器sampling profiler核心亮点在于规避传统采样剖析器普遍存在的 Safepoint Bias 问题并能同时采集 Java、JVM、原生native与内核kernel栈帧。本文以 README.md 为主体结合 docs/ 系列指南与仓库源码系统介绍它的核心能力、快速上手方法、输出格式、从源码构建的完整流程以及官方文档地图帮助你在生产环境中快速定位 CPU、内存与锁竞争等性能瓶颈。项目定位为什么选择采样式剖析器Java 传统的剖析器往往依赖 JVMTI 或字节码插桩会带来显著的运行时开销而采样式剖析器通过在固定时间间隔抓取线程调用栈来推断热点开销更低。不过多数采样剖析器存在著名的Safepoint Bias安全点偏差问题——它们只能在 JVM 安全点采集线程快照导致真正处于安全点之外的繁忙代码被低估。async-profiler 的解决之道是使用 HotSpot 专有的AsyncGetCallTraceAPI 来采集 Java 调用栈从而不受安全点偏差影响在 CPU 剖析模式下它还借助 Linux 内核的perf_events事件见 src/perfEvents_linux.cpp获取内核与原生调用栈并将两者匹配成完整的 Java 原生调用链。这一设计带来两个直接优势详见 docs/ProfilingModes.md与传统 Java 剖析器不同它能够监控非 Java 线程例如 GC 线程、JIT 编译线程并在栈轨迹中展示原生帧与内核帧适用于 OpenJDK 以及所有基于 HotSpot JVM 的运行时如 Amazon Corretto、Liberica、Azul Zulu 等。可剖析的能力清单README 明确列出了 async-profiler 支持剖析的对象这些能力分别对应 docs/ProfilingModes.md 中的剖析模式能力说明对应事件/选项CPU 时间采集 CPU 消耗热点含 Java、native、JVM、内核栈帧-e cpuJava 堆分配定位堆内存分配最多的调用点TLAB 驱动采样-e alloc/--alloc N原生内存分配与泄漏记录malloc/realloc/calloc/free匹配未释放的分配以定位泄漏-e nativemem竞争锁Contended locks度量 Java 锁竞争、等待时间与被阻塞的代码路径-e lock硬件与软件性能计数器缓存未命中、缺页、上下文切换等 PMU/perf 事件-e cache-misses等其他模式墙钟wall clock、Java 方法插桩、原生函数、tracepoint、kprobe/uprobe 等见 docs/ProfilingModes.md从源码看事件名称的解析集中在 src/arguments.cpp其中alloc、nativemem、lock、wall、cpu等均为内建事件关键字而 perf 事件、硬件断点mem:、tracepoint、探针与 PMU 事件则通过list动作或-e参数动态指定。下载与获取二进制稳定版 v4.5README 当前标注的稳定版本为4.5提供以下官方构建产物Linux x64async-profiler-4.5-linux-x64.tar.gzLinux arm64async-profiler-4.5-linux-arm64.tar.gzmacOSarm64/x64async-profiler-4.5-macos.zip独立剖析数据转换器jfr-converter.jarNightly 构建仓库还提供对应master最新提交的 nightly 二进制包适用于希望抢先体验新功能的场景历史提交对应的构建产物可在 Actions 工作流test-and-publish-nightly的 artifacts 中找到通常保留 30 天。快速开始一条命令产出火焰图在典型场景下剖析一个 Java 应用只需要用asprof指定运行中 Java 进程的 PID$ asprof -d 30 -f flamegraph.html PID这条命令的含义是运行剖析器 30 秒并将结果保存为可在浏览器中交互查看的火焰图flamegraph.html-d指定剖析时长-f指定输出文件。asprof是一个附着并控制 agent 的工具——剖析器实际上以 agent 身份运行在被剖析的 JVM 进程内部。剖析前的系统准备根据 docs/GettingStarted.md在 Linux 4.6 及以上内核中非 root 进程使用perf_events采集内核调用栈需要设置两个内核参数# sysctl kernel.perf_event_paranoid1 # sysctl kernel.kptr_restrict0为提升剖析精度官方建议在启动 JVM 时附带-XX:UnlockDiagnosticVMOptions -XX:DebugNonSafepoints标志除非 async-profiler 在 JVM 启动时即被加载详见 docs/Troubleshooting.md 的已知限制部分。查找目标进程使用jps或pgrep -a java找到目标进程$ jps 9234 Jps 8983 Computey $ asprof start 8983 $ asprof stop 8983asprof start/stop属于半自动模式start后剖析器持续运行直到显式执行stop才停止并打印报告。除 PID 外还可用以下方式指定目标关键字jps——当系统只有一个 Java 进程时自动解析 PIDjps输出中的应用名如Computey。也可以直接用-d一步完成启动—运行 N 秒—停止$ asprof -d 30 8983默认采样频率为100Hz每 10ms CPU 时间采样一次。asprof的控制台输出示例如下节选--- Execution profile --- Total samples: 687 Unknown (native): 1 (0.15%) --- 6790000000 (98.84%) ns, 679 samples [ 0] Primes.isPrime [ 1] Primes.primesThread ...由此可见最热点方法为Primes.isPrime到达它的最热调用链来自Primes.primesThread。生成火焰图指定-o flamegraph即可输出交互式 HTML 火焰图当输出文件名以.html结尾时火焰图格式会被自动选中$ asprof -d 30 -f /tmp/flamegraph.html 8983生成的 HTML 可在任意浏览器中打开交互式解读火焰图的方法详见 docs/FlamegraphInterpretation.md。支持的命令行动作与常用选项asprof的命令行格式为asprof [action] [options] [PID]动作action包括完整表格见 docs/ProfilerOptions.md动作说明start半自动模式启动剖析直到显式stopresume恢复此前停止的剖析会话已采集数据保持有效stop停止剖析并打印报告dump导出已采集数据但不停止剖析status打印剖析状态与已运行时长metrics以 Prometheus 格式打印剖析器指标list列出目标进程可用的剖析事件常用通用选项asprof侧写法同时列出以 agent 方式启动时的等价写法-o fmt/fmt指定输出格式可选traces[N]、flat[N]、jfr、collapsed、flamegraph、tree、otlp可同时指定多个-f FILENAME/fileFILENAME输出文件名支持占位符%pPID、%t时间戳、%n{MAX}序号、%{ENV}环境变量若为http(s)://URL 则直接发送到 OTLP 端点-d N仅asprof可用的交互式时长参数等价于 start sleep N 秒 stop--timeout N/timeoutNagent 场景下的剖析时长--loop TIME/loopTIME持续剖析连续剖析参数为时钟时间hh:mm:ss或时长s/m/h/d文件名务必包含时间戳占位符以免每次迭代覆盖-e EVENT/eventEVENT剖析事件如cpu、alloc、nativemem、lock、cache-misses等-i N/intervalN采样间隔含义随事件而异CPU 为纳秒、墙钟为时间、方法剖析为调用次数、PMU 为事件数时间可带s/ms/us/ns后缀--alloc N/allocN分配剖析间隔字节支持k/m/g后缀--live/live仅保留存活对象样本用于定位 Java 堆泄漏--trace METHOD[:T]/traceMETHOD[:T]跟踪指定 Java 方法并可附带延迟阈值--lock TIME/lockTIME锁竞争剖析的采样阈值--cstack MODE/cstackMODEC 栈回溯方式fp帧指针、dwarfDWARF 展开信息、vm/vmxHotSpot VM Structs或no不采集 C 栈。输出格式一览async-profiler 支持多种输出格式详见 docs/OutputFormats.mdcollapsed每行一个以分号分隔的调用栈 计数可直接供 FlameGraph 脚本生成可视化flamegraphHTML 交互式火焰图分层、彩色编码地呈现调用轨迹treeHTML 调用树视图按资源占用从高到低展开text默认文本格式未指定-o且文件名无扩展名时即前述控制台报告jfrJDK Flight Recorder 格式兼容 JDK Mission ControlJMC与 IntelliJ IDEA 等工具且是唯一支持多事件同时输出的格式otlpOpenTelemetry 协议格式实验特性除本地文件外可直接发送到 OTel 兼容端点未指定路径时默认使用/v1development/profiles。火焰图解读要点火焰图的 X 轴不再表示时间线而是表示栈轨迹在剖析期间被观察到的频率相同函数在同一栈深的区块会被拼接聚合图示过程见 docs/FlamegraphInterpretation.md。async-profiler 还用颜色区分帧类型JIT 编译方法、内联方法、解释方法与 C1 编译方法等使用不同配色帮助快速辨别代码执行形态。从源码构建最低要求README 明确列出的构建前提makeGCC 7.5.0 或 Clang 7.0.0静态版 libstdc例如 Amazon Linux 2023 上执行yum install libstdc-staticJDK 11构建步骤确保gcc、g、java均在PATH中然后在仓库根目录执行$ make构建完成后启动器位于build/bin/asprof。从 Makefile 可以看到all目标还会产出剖析器核心库lib/libasyncProfiler.somacOS 为.dylib由 src 下的全部.cpp源文件合并编译MERGEtrue时通过#include合并为单一翻译单元Java API 库jar/async-profiler.jar由 src/api/one/profiler 编译源码为 AsyncProfiler.java、Events.java、Recording.java、Span.java 等剖析数据转换器bin/jfrconv内含jfr-converter.jar主类为one.convert.Main。其他常用 Makefile 目标make test——运行单元测试与集成测试先执行 C 测试build/test/cpptests再通过 test/one/profiler/test/Runner.java 运行 Java 测试套件make release——将二进制打包为.tar.gzLinux或.zipmacOSmake clean——清理build目录。版本号由 Makefile 中的PROFILER_VERSION控制当前为 4.5打包文件名形如async-profiler-4.5-linux-x64.tar.gz。支持平台官方维护构建其他可用移植Linuxx64、arm64x86、arm32、ppc64le、riscv64、loongarch64macOSx64、arm64架构与操作系统标签在 Makefile 中根据uname自动推断交叉编译可通过CROSS_COMPILE变量指定工具链前缀。集成方式与文档地图除了命令行工具async-profiler 还提供多种集成途径以 agent 方式随 JVM 启动适合剖析启动期代码与连续剖析$ java -agentpath:/path/to/libasyncProfiler.sostart,eventcpu,fileprofile.html ...macOS 上库名为libasyncProfiler.dylib。agent 参数是逗号分隔的选项列表asprof内部正是把命令行参数转换成该格式后附着到目标进程的详见 docs/IntegratingAsyncProfiler.md。Java API 编程式控制通过 Maven 依赖tools.profiler:async-profiler引入后调用AsyncProfiler.getInstance().execute(start,jfr,eventcpu,file...)与execute(stop)即可%p占位符会被替换为进程 PID。Span API在 Java 代码中用Span.start()/Span.end(span, GET /api/orders)记录请求级区间并以profiler.SpanJFR 事件写入与剖析样本同一条时间线的录制中便于按请求过滤剖析数据。API 为静态且零分配剖析器未运行时调用为 no-op可安全保留在生产代码中源码见 src/api/one/profiler/Span.java。IntelliJ IDEAIDEA 内置 async-profiler可在Settings/Preferences Build, Execution, Deployment Java Profiler中配置 agent 选项勾选Collect native calls以采集非 Java 线程与原生栈帧。README 还整理了完整的文档地图便于按需深入基础使用Getting Started、Profiler Options、Profiling Modes、Integrating async-profiler、Profiling In Container剖析输出Output Formats、FlameGraph Interpretation、JFR Visualization、Converter Usage、Heatmap高级用法CPU Sampling Engines、Stack Walking Modes、Advanced Stacktrace Features、Profiling Non-Java Applications故障排查Troubleshooting结语从 README 出发可以看到async-profiler 以AsyncGetCallTraceperf_events的组合打破了传统采样剖析器的安全点偏差限制让 Java 开发者能以极低开销同时观察 Java、原生与内核三层的真实热点。无论是用asprof -d 30 -f flamegraph.html PID快速产出一张火焰图还是以 agent/Java API/Span API 的方式深度集成、或用--loop做连续剖析并与 JFR 生态衔接它都能覆盖从日常性能排查到生产环境持续监控的完整链路。结合仓库内 docs 各指南与源码你可以针对 CPU、堆分配、原生内存泄漏与锁竞争等具体场景进一步展开精细化剖析。【免费下载链接】async-profilerSampling CPU and HEAP profiler for Java featuring AsyncGetCallTrace perf_events项目地址: https://gitcode.com/GitHub_Trending/as/async-profiler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价