读取分析器快照
最后修改时间:2023 年 9 月 8 日可以通过以下模式查看使用IntelliJ Profiler配置生成的快照:
CPU 时间– 与实际 CPU 工作相对应的样本子集,不包括 IO、等待锁、上下文切换等。对于识别 CPU 密集型部分很有用,您可以在其中从优化中获得最大收益,例如提高算法复杂性。
总时间– 所有样本,包括睡眠线程的样本。此模式对于考虑感知性能和实际运行时非常有用,包括 IO、上下文切换开销、同步等。有了它,您可以发现可能因外部因素或次优并发而减慢的部分。
内存分配– 与内存分配事件相对应的样本子集。此模式对于识别内存密集型部分非常有用,您可以在其中通过优化基元装箱、对象创建等的数量来获得最大收益。
提示
有关采样的更多信息,请参阅:IntelliJ IDEA 分析器的工作原理
切换观看模式
使用工具窗口右上角的菜单。
IntelliJ IDEA 提供了多种工具来分析快照:
编辑器内提示– 在编辑器中评估特定代码行性能的直观方法
调用树– 表示代码路径及其在总体 CPU/内存使用中所占份额的树
火焰图——代码路径的图形表示,通过将堆栈帧表示为视觉元素来促进分析和导航
方法列表– 提供各个方法而不是代码路径的聚合统计信息的平面视图
时间轴– 线程随时间活动的直观表示
浏览快照
当您关注Profiler工具窗口的选项卡中的特定方法时,IntelliJ IDEA 会在编辑器中打开相应的源。此外,您可以右键单击它并选择另一个Profiler工具窗口选项卡将其打开。
线程数
Profiler工具窗口选项卡中的分析数据按线程分组。您可以选择查看整个进程的合并数据(所有线程合并)或选择特定线程进行更仔细的调查。
笔记
编辑器内探查器提示始终显示所有线程的组合运行时间。
线程列在Profiler工具窗口的左侧,并按收集的样本数量排序。因此,您可以在列表顶部找到最繁忙的线程。
线轮廓仪
当您打开快照时,IntelliJ IDEA 会显示Profiler工具窗口,并在编辑器中相应行附近添加运行时提示。
花费大量时间执行的行会获得灰色标签,而最消耗资源的方法则用带火图标的红色标签标记。
提示
在Profiler工具窗口中切换查看模式也会更改编辑器中标签的模式。您可以选择查看该方法的总执行时间、其 CPU 时间或作为执行该行的结果而分配的内存量。
如果您想深入查看标记方法内部的内容,单击提示将带您进入方法声明,您可以在其中检查导致缓慢的特定行的实现。
火焰图
火焰图将应用程序调用树可视化,其中的矩形代表调用堆栈的帧,按宽度排序。消耗更多资源的框架比其他框架更宽,并且放置在左侧。
例如,我们可以从上面的火焰图中得出以下观察结果:
的执行时间
main()
是由方法a()
和决定的b()
。依次a()
称为c()
.c()
主要是向 an 中添加元素ArrayList
,如果 the 的容量ArrayList
足够的话,这可能需要更少的时间 -add
主要是忙着增加列表。大部分时间
b()
都是在处理IndexOutOfBoundsException
。分析这些异常从何而来,看看我们是否可以采取一些措施,这可能是个好主意。
笔记
火焰图仅反映执行摘要。它聚合堆栈跟踪,忽略它们的时间顺序。因此,诸如方法何时执行等详细信息超出了此类分析的范围
IntelliJ Profiler 使用颜色编码来区分不同类型的框架:
框架式 | 浅色主题 | 深色主题 |
---|---|---|
项目代码 | 黄色的 | 黄色的 |
库代码 | 紫色的 | 灰色的 |
原生代码 | 蓝色的 | 蓝色的 |
笔记
默认情况下,本机分析处于关闭状态。要启用它,请转至设置| 构建、执行、部署 | Java Profiler并选中“收集本机调用”选项。
获取通话详情
将鼠标悬停在块上可查看包含框架详细信息的工具提示。工具提示显示整个快照和框架的直接父级中的时间份额。
缩放图表
使用火焰图工具栏或滚轮上的和按钮来缩放图表。
要关注特定方法,请双击图表上的相应块。
要恢复图形的原始大小,请单击工具栏上的1:1 。
设置节点阈值
可能很难判断节点是否占快照中的大部分时间或样本,特别是当视图放大并且比例不易识别时。在这种情况下,您可以设置一个阈值,将不够重的节点灰显。
单击并选择“显示节点过滤器”。
使用火焰图右侧的滑块。未通过此阈值的节点将显示为无色。
搜索图表
如果您想在图表上找到特定方法,请开始键入其名称或单击并在搜索栏中键入名称。
该图突出显示了方法名称与您的搜索请求匹配的所有块。
使用和可以在搜索结果之间快速导航。使用工具栏上的按钮,您还可以搜索整个图表或特定子树,并在找到某些内容后立即导航到结果。
捕获图表
您可以将图表与快照中的其他数据分开捕获和导出。
单击并选择“复制到剪贴板”或单击“保存”将图表导出为.png格式的图像。
提示
有关火焰图的更多信息,请参阅火焰图。
调用树
“调用树”选项卡以树状结构组织采样数据。
对于每种方法,该选项卡显示以下信息:
默认情况下,该百分比是相对于总执行时间的。您可以选择查看相对于父框架的数字。
在总计和父级之间切换百分比
单击并选择“显示总时间百分比”或“显示父时间百分比”。
过滤调用树结果
“调用树”选项卡允许您折叠当前不感兴趣的框架。例如,您可以隐藏库类或来自特定框架的类,以专注于应用程序代码。
百分比后面的蓝色箭头表示经过过滤的调用序列。
禁用过滤
单击并取消选择“过滤呼叫”选项。
配置过滤规则
在“设置”对话框 ( ) 中,选择“构建”、“执行”、“部署”| Java 分析器 | 过滤器。CtrlAlt0S
在此对话框中,您可以修改现有规则并添加新规则。
配置要在输出中隐藏的包或特定类。
要过滤类中的所有方法,请指定完全限定的类名(例如:
org.bar.ClassName
)。要过滤类中的特定方法,请使用以下格式:完全限定类名 : 方法名称(例如:
* : myMethod()
)。
折叠递归调用
涉及递归的堆栈可能很难分析。在常规的“调用树”视图中,递归调用按调用方式显示——一个接一个,这可能会导致几乎无限的堆栈滚动。
当在调用堆栈的更高层调用相同的方法时,IntelliJ IDEA 会检测递归。在这种情况下,子树将从调用树中取出,然后附加回该方法的第一次调用。通过这种方式,您可以绕过递归并专注于消耗大部分资源的方法及其进行的调用。
折叠递归调用允许您查看这些调用所花费的总时间,就好像没有递归一样。
折叠递归调用在“调用树”选项卡上用 图标进行标记。单击它可在单独的选项卡中打开递归调用树。您可以在将鼠标悬停在递归图标上时出现的工具提示中预览合并调用的数量。
假设:专注于具体方法
IntelliJ IDEA 允许您检查调用树中的特定节点和子树:您可以排除特定方法,或者反之亦然,仅关注您当前感兴趣的节点。
右键单击“调用树”选项卡上的必要节点,然后选择以下选项之一以在专用选项卡中打开结果:
聚焦子树:仅显示选定的方法调用。父方法示例计数器仅显示在所选子树中花费的时间。
Focus On Call:显示所选方法以及调用它的方法。启用此选项后,每一帧仅显示在所选方法中花费的时间。
排除子树:忽略选定的方法调用。
排除调用:忽略对所选方法的所有调用。
方法列表
方法列表收集配置文件数据中的所有方法,并按累积采样时间对它们进行排序。此列表中的每个项目都有多个视图:
Back Traces显示调用者的层次结构。使用此视图可以跟踪哪些方法调用了所选方法。
合并的被调用者是总结调用层次结构中的方法的调用树。
被调用者列表是总结调用层次结构中的方法的方法列表。
时间线
时间线提供了监视各个线程的活动的能力。它可以可视化一段时间内的 CPU 活动和内存分配,这对于一系列任务非常有用,例如找出最活跃的线程、调查并发问题和分析 I/O。
红色竖条表示线程睡眠状态
绿色竖条表示线程运行状态
蓝色竖条表示内存分配事件
顶部的图表显示了 CPU 负载
过滤时间线上的事件
打开工具窗口右上角的“过滤器”菜单,然后选择必须可见的事件类型。
获取事件的堆栈跟踪
单击时间线上的事件。堆栈跟踪显示在探查器工具窗口的右侧。
提示
您可以通过单击相应的堆栈帧导航到方法声明。
感谢您的反馈意见!