IntelliJ IDEA 2025.1 Help

阅读分析器快照

创建的快照 madeIntelliJ 分析器 配置可以在以下模式查看:

  • CPU 时间 — 与实际 CPU 工作相对应的样本子集,不包括 IO、等待锁、上下文切换等。 有助于识别 CPU 密集型部分,您可以通过优化算法复杂性等方式从中获得最大收益。

  • 总时间——所有示例,包括那些用于静止线程的示例。 这种模式对考虑感知性能和实际运行时间非常有用,包括 IO、上下文切换开销、同步等。 借助它,您可以发现可能因外部因素或不佳的并发性而变慢的部分。

  • 内存分配 — 对应内存分配事件的样本子集。 此模式有助于识别内存密集型部分,您可以通过优化装箱原语数量、对象创建等方式获得最大收益。

切换查看模式

  • 请使用工具窗口右上角的菜单。

    Profiler 工具窗口右上角的 Show 菜单

IntelliJ IDEA 提供了几种视图来分析快照:

  • 编辑器内提示——一种在编辑器中直观评估特定代码行性能的方法

  • 调用树 - 表示代码路径及其在整体 CPU / 内存使用中所占比例的树

  • Flame graph—代码路径的图形表示,通过将栈帧表示为视觉元素,便于分析和导航

  • 方法列表——一种平面视图,为单个方法提供聚合统计数据,而不是代码路径

  • 时间线——线程活动随时间变化的直观表示

浏览快照

默认情况下,库和框架方法显示为折叠状态。 您可以通过点击对应帧中的展开按钮来展开折叠的调用。

将鼠标指向火焰图框架中的“expand”按钮

当您在 性能分析器 工具窗口的某个选项卡中关注特定方法时,IntelliJ IDEA会在编辑器中打开相应的来源。 此外,您可以右键点击它并选择另一个 性能分析器 工具窗口选项卡来打开它。

在 Profiler 工具窗口中跳转标签

线程

性能分析器 工具窗口选项卡中的性能分析数据按线程分组。 您可以选择查看整个过程的合并数据(所有线程已合并 ),或选择一个特定的线程进行详细调查。

显示线程

默认情况下,线程列表是隐藏的,并且数据显示为所有线程的汇总。

  • 要选择特定线程或查看线程列表,请点击左侧工具栏中的 显示线程视图

Profiler 工具窗口中的 Threads 面板

线程列表位于 分析器 工具窗口的左侧,并按收集到的样本数量进行排序。 因此,您可以在列表顶部找到最繁忙的线程。

行分析器

当您打开快照时,IntelliJ IDEA 会显示 性能分析器 工具窗口,并在编辑器中相应的行右侧添加运行时提示。

执行时间较长的行会显示灰色标签,而最耗资源的方法会用带有火焰图标的红色标签标记。

打开快照时显示行分析器提示

切换视图模式性能分析器 工具窗口中也会更改编辑器中标签的模式。 您可以选择查看方法的总执行时间、其 CPU 时间或执行此行所分配的内存量。

如果您想深入了解标记方法的内部内容,点击提示将带您到方法声明,您可以检查导致缓慢的特定行。

方法实现使用运行时标签标记

火焰图

火焰图通过矩形可视化应用程序调用树,这些矩形代表调用栈帧,按宽度排序。 占用更多资源的帧比其他帧更宽,并且放置在左侧。

火焰图的一部分

例如, 从上面的火焰图中我们可以做出以下观察:

  • main() 的执行时间是由方法 a()b() 贡献的。 最终调用了 a()c()

  • c() 主要是向 ArrayList 添加元素,如果 ArrayList 的容量足够,这可能会花费更少的时间——添加 主要忙于增长列表。

  • 大多数时候 b() 正在处理 IndexOutOfBoundsException。 分析这些异常的来源,并查看是否可以采取措施处理,可能是个好主意。

IntelliJ Profiler 使用颜色编码来区分不同类型的帧:

帧类型

浅色主题

深色皮肤

项目代码

黄色

黄色

库代码

紫色

灰色

原生代码

蓝色

蓝色

火焰图中不同类型框架的颜色编码

获取呼叫详情

  • 将鼠标悬停在块上以查看包含框架详细信息的工具提示。 工具提示显示了整个快照中的时间占比以及框架直接父级中的时间占比。

    将鼠标悬停在火焰图中的框架上时,会出现包含详细信息的工具提示

缩放图表

  • 请使用工具栏上的 “缩放”按钮缩小按钮 按钮或者滚轮来缩放图表。

  • 要专注于特定方法,请双击图表上的相应块。

  • 要还原图形的原始大小,请点击工具栏上的 1:1

    火焰图左侧的按钮允许您放大和缩小

设置节点阈值

在视图放大且比例尺不易识别时,可能很难判断某个节点是否占据了快照中相当大的一部分时间或样本。 在这种情况下,您可以设置一个阈值来将不够重要的节点显示为灰色。

  1. 点击 演示设置按钮 并选择 显示节点筛选器

  2. 使用火焰图右侧的滑块。 没有通过此阈值的节点将显示为无色。

    在“展示设置”菜单中设置节点过滤器
  • 如果您想在图上定位特定方法,请开始输入其名称或点击 显示搜索工具栏 并在搜索栏中输入名称。

    图表突出显示所有与您的搜索请求匹配的方法名称的块。

    在 Flame Graph 选项卡中使用搜索

    使用 上一个匹配下一个出现 快速导航搜索结果之间。 使用工具栏上的按钮,您还可以搜索整个图或特定子树,并在发现结果后立即导航到结果。

捕获图表

您可以将图表与快照中的其他数据分开捕获和导出。

  • 点击 捕获图像 并选择 复制到剪贴板 ,或者点击 保存 将图表以 .png 格式导出为图像。

调用树

调用树 选项卡以树状结构组织采样数据。

分析器结果中的调用树选项卡

对于每个方法,该选项卡显示以下信息:

默认情况下,百分比是相对于总执行时间的。 您可以选择查看相对于父框架的数字。

在总计和父项之间切换百分比

  • 点击 演示设置按钮 并选择 显示总时间的百分比显示父项的百分比

    在演示设置菜单中的显示总时间百分比/父按钮

筛选调用树结果

调用树” 选项卡允许您折叠当前不感兴趣的框架。 例如,您可以隐藏库类或来自特定框架的类,以便专注于应用程序代码。

蓝色箭头紧跟百分比之后,表示过滤后的调用序列。

显示筛选后的调用

禁用筛选

  • 点击 演示设置按钮 并取消选择 Filter Calls 选项。

配置筛选规则

  1. 设置 对话框(Ctrl+Alt+S )中,选择 构建、执行、部署 | Java Profiler | 过滤器

    在此对话框中,您可以修改现有规则并添加新规则。

  2. 配置您想要隐藏在输出中的包或特定类。

    • 要筛选类中的所有方法,请指定完全限定类名(例如: org.bar.ClassName

    • 要筛选类中的特定方法,请使用以下格式: 完全限定类名 : 方法名 (例如: * : myMethod())。

折叠递归调用

涉及递归的栈可能很难分析。 在常规 调用树 视图中,递归调用按调用顺序显示——一个接一个,可能会导致几乎无限的堆栈滚动。

IntelliJ IDEA 在调用堆栈的更高位置调用相同方法时检测递归。 在这种情况下,子树将从调用树中取出,然后附加回该方法的第一次调用。 这样,您可以绕过递归,专注于消耗大部分资源和调用的方法。

折叠递归调用使您能够看到在这些调用中消耗的总时间,就像没有递归一样。

折叠递归调用按钮

折叠的递归调用在 递归图标 图标上 调用树 标签中标记。 点击它以在单独的选项卡中打开递归调用树。 当鼠标悬停在递归图标上时,您可以在工具提示中预览合并调用的数量。

若如此:专注于特定方法

IntelliJ IDEA 允许您检查 调用树 中的特定节点和子树:您可以排除特定的方法,或者反过来,只关注您目前感兴趣的节点。

右键点击 调用树 选项卡上的必要节点,然后选择以下选项之一,以在专用选项卡中打开结果:

  • 聚焦于子树 :仅显示选中的方法调用。 父方法示例计数器仅显示在选定子树中花费的时间。

  • 聚焦于调用 :显示所选方法及其调用方法。 启用此选项后,每个帧仅显示在所选方法中花费的时间。

  • 排除子树 :忽略所选的方法调用。

  • 排除调用 :忽略对选定方法的所有调用。

方法列表

方法列表 会收集配置文件数据中的所有方法,并按累积样本时间对它们进行排序。 此列表中的每个项目都有几个视图:

  • 反向跟踪 显示调用者的层次结构。 使用此视图追踪哪些方法调用了所选方法。

  • 合并的被调用方 是调用树,汇总了调用层次结构中的方法。

  • 被调用方列表 是汇总调用层次结构中所有方法的方法列表。

分析结果中的方法列表标签

时间线

时间线提供监控单个线程活动的能力。 它可视化 CPU 活动和内存分配随时间的变化,这对于一系列任务非常有用,例如找出最活跃的线程、调查并发问题以及分析 I/O。

在 Profiler 工具窗口中的 时间线
  • 红色竖条表示线程休眠状态

  • 绿色竖条表示线程运行状态

  • 蓝色竖条表示内存分配事件

  • 顶部的图表显示 CPU 负载。 要将图表切换为堆内存使用情况,请选择 内存分配 模式。

筛选时间轴上的事件

  • 请打开工具窗口右上角的 筛选 菜单,并选择必须显示的事件类型。

获取事件的堆栈跟踪

  • 点击时间线上 的事件。 堆栈跟踪显示在 分析器 工具窗口的右侧。

    会打开一个面板,显示所选瞬间的堆栈跟踪

    要导航到方法声明,请点击对应的堆栈帧。 要复制堆栈,请右键点击并选择 复制 Stack

最后修改日期: 2025年 4月 24日