性能剖析(新版)

最近更新时间:2025-03-10 21:38:43

我的收藏
性能剖析能力基于 async-profiler 等技术实现,以极低的性能开销,采集剖析数据。基于预置的智能分析引擎,新版性能剖析可以直接输出性能优化建议,并提供增强版火焰图等功能强大的性能分析工具,帮助用户快速定位应用性能瓶颈。

前提条件

应用使用腾讯云增强版 Java 探针接入,探针版本2.3-20250131及以上。
运行环境需要安装 OpenJDK 或其他基于 HotSpot JVM 开发的 JDK,暂不支持仅安装了 JRE 的环境。
支持 Linux(x64, arm64)以及 macOS 操作系统,暂不支持 Windows。
不推荐使用 Java 8u352以下的 JDK,可能存在 内存崩溃 风险。

操作步骤

2. 在左侧菜单栏选择应用性能监控 > 应用诊断,进入性能剖析(新版)页面。
3. 在页面左侧的实例列表中找到需要进行性能剖析的实例,单击发起任务
4. 在弹出对话框中,根据需要调整采集类型等选项,单击确认
选项名
说明
采集类型
目前支持 CPU 采样分析内存采样分析两种采集类型:
CPU 采样分析:基于代码块在 CPU 上的执行时间进行剖析。
内存采样分析:基于内存占用进行剖析。
采样时长
采样时长代表每一次剖析采集数据的时间长度。实际的采集时间会略大于采样时长。
目标时间
目标时间代表剖析任务创建以后,第一次剖析的执行时间:
立即执行:不等待,立即执行剖析。
指定时间:指定未来24小时内的任意时间点执行剖析。
执行次数
执行次数代表一个剖析任务将被执行多少次:
单次执行:仅执行一次。
重复执行:剖析任务按将照固定的时间间隔被执行多次,用户需要指定总次数以及间隔时长。
5. 采集任务提交后,可以在页面右侧的性能剖析记录中查询剖析结果,当采集状态为采集完成时,单击剖析结果,在弹出页面查看性能剖析结果。剖析结果包含5个模块,通过不同的标签页进行展示。
分析建议
分析建议模块基于预置的智能分析引擎输出性能优化建议。针对每条性能优化建议,单击标记按钮,可以对优化建议的价值进行反馈,帮助 APM 提升分析建议的准确度。
活跃线程
活跃线程模块列出了每条线程被采中的次数,次数越高,代表线程的活跃度越高,可以重点关注。
热点函数
热点函数模块列出了每个函数被采中的次数,次数越高,代表函数的性能消耗越大,可以重点关注。
火焰图
火焰图是一种用于可视化程序性能数据的强大工具,是一个由多个矩形条堆积而成的图形,每一层矩形条代表一个函数调用栈中的函数(在 Java 等语言中,函数可以等同于方法)。
水平方向表示函数的性能开销,基于不同的采样类型进行衡量,越宽表示性能开销越大。以内存采样分析为例,矩形条的宽度代表函数的内存占用情况。需要注意的是,性能开销通过函数在抽样中出现的频率来体现,并不是绝对值,所以需要重点关注它们之间的相对占比。
垂直方向表示函数调用栈的深度,最下面的函数是当前正在执行的函数,向上依次是它的调用者。
通过观察火焰图中宽度较大的矩形条,可以快速定位到程序中性能开销较大的热点函数。这些热点函数通常是优化的重点对象,因为它们的性能改进可能会对整个程序的性能产生较大影响。沿着火焰图的垂直方向,可以分析函数之间的调用关系,了解哪些函数调用了热点函数,以及它们的调用频率和执行时间分布,有助于深入理解程序的执行流程和性能瓶颈所在。
在分析火焰图时,建议从深度最深的函数开始分析。栈最深,出现在火焰图中的位置会越靠近下方,也就是“火苗”的位置(不同于自然界的火焰,在 APM 目前使用的火焰图中,火焰朝向下方)。苗越宽,代表性能上的消耗越大,所以宽火苗往往是引发性能问题的根源。

在火焰图的使用过程中,可以关注如下两类指标数据:
总计占比:表示从函数调用栈的最底层到当前函数(包括当前函数及其所有子函数)的性能开销的占比。这个数据反映了当前函数及其整个调用路径在整个程序执行过程中的相对重要性。
自身总比:指当前函数自身的性能开销,不包括它调用其他函数的性能开销。这个指标可以帮助开发者了解当前函数本身的性能开销,而不受到其调用的其他函数的影响。
单击火焰图中的其中一个矩形条,火焰图中将只展示在垂直方向上处于该矩形条调用路径上的矩形条。在这种情况下,该矩形条可以被称为所选区域,而整个应用进程所占的区域可以被称为整体区域(也就是最上层的 root 矩形条)。因此,总计占比自身占比都可以基于所选区域整体区域来计算。单击最上层的 root 矩形条,可以回到火焰图的初始状态,在这种情况下,整体区域等同于所选区域。
调用图
调用图和火焰图比较类似,同样能够体现每个函数在整个程序执行过程中的相对性能开销占比。和火焰图不同的是,当一个函数有多个调用方时,调用图更能够体现出函数之间的调用关系。但调用图不能通过矩形的宽度直观展示性能开销,因此大多数场景下,调用图都是配合火焰图来使用。