JProfiler帮助文档

调用树分析

调用树 展示了 JProfiler 记录下来的实际调用栈。在分析调用树时,可以对调用树应用一些转换,以便更容易地进行解释。这些转换可能会耗费较多时间,并且会以与调用树视图中的功能不兼容的方式更改输出格式,因此会创建新的视图来显示分析结果。

要执行此类分析,请在调用树视图中选择一个节点,然后从工具栏或上下文菜单中选择某个调用树分析操作。

一个嵌套视图会在调用树视图下方创建。如果再次执行相同的分析操作,分析结果会被替换。若要同时保留多个分析结果,可以将结果视图固定(pin)。此时,对同类型的下一次分析会创建一个新的视图。对于已固定的视图,视图顶部会显示一个重命名按钮,可用于更改在左侧视图选择器中显示的名称。

在实时会话中,结果视图不会随着调用树的更新而更新,而是显示分析时刻的数据。要针对当前数据重新计算分析结果,请使用重新加载操作。如果调用树本身需要重新计算(如在禁用自动更新的分配树中),重新加载操作也会处理这一点。

调用树快照

“创建调用树快照”分析会简单地创建当前调用树的静态副本。这对于在不保存和打开 JProfiler 快照的情况下比较不同用例非常有用。同时,它也提供了一种在调用树仍在被记录时,操作冻结副本的方式。

“创建调用树快照”分析仅在“CPU 视图”部分的“调用树”视图中可用。如果你固定了调用树快照视图,可以同时拥有多个调用树快照。与其他分析不同,调用树快照会保存在 JProfiler 快照中,因为它们构成了独立的数据集。

除了可用于调用树视图的调用树分析外,调用树快照还提供了“计算热点”操作,用于计算父视图的热点,类似于“CPU 视图”部分的“热点”视图。从嵌套在调用树快照视图下方的视图中访问的所有分析,都是基于其父调用树快照的数据,而不是顶层调用树视图的数据。

递归折叠

使用递归的编程风格会导致调用树难以分析。“折叠递归”调用树分析会计算一个所有递归都被折叠的调用树。调用树中当前选中节点的父节点作为本次分析的 调用树根节点 (call tree root)。要分析整个调用树,请选择某个顶层节点。

当同一个方法在调用栈的更高层已经被调用时,就会检测到递归。此时,子树会从调用树中移除,并拼接回该方法的首次调用处。调用树中的该节点会加上一个图标,鼠标悬停时会显示递归次数。在该节点下方,不同深度的调用栈会被合并。合并的调用栈数量也会显示在提示信息中。折叠递归的总数会显示在标题栏中,位于原始调用树设置参数信息的上方。

对于简单递归,合并的调用栈数量等于递归次数加一。因此,递归提示显示“1 次递归”的节点,其树中节点会显示“2 个合并栈”在递归提示中。在更复杂的情况下,递归会嵌套并产生重叠的合并调用树,因此合并栈的数量会随调用栈深度而变化。

在将子树从调用树中移除以便在更高层合并的位置,会插入一个特殊的  “已移动节点” 占位符。

分析累计的外部调用

在调用树中,你可以看到选定方法的外部调用,但仅限于该方法在某个特定调用栈上的调用。感兴趣的方法可能在不同的调用栈中被调用,通常需要分析所有这些调用的累计调用树,以获得更好的统计信息。“计算累计外部调用”分析会展示一个调用树,汇总选定方法的所有外部调用,无论该方法是如何被调用的。

对于选定方法,JProfiler 会收集其所有顶层调用(不考虑递归调用),并在结果树中进行累计。标题栏会显示在该过程中累计的顶层调用点数量。

在视图顶部,有一个复选框可以选择是否在结果树中折叠递归,类似于“折叠递归”分析。如果递归被折叠,顶层节点和第一层外部调用会显示与方法调用图相同的数值。

计算回溯路径

“计算回溯路径”分析是对“计算累计外部调用”分析的补充。与后者一样,它会汇总选定方法的所有顶层调用(不考虑递归调用)。但它不是显示外部调用,而是显示导致选定方法被调用的回溯路径。调用从最深的节点开始,逐步向上到达顶部的选定方法。

此分析类似于热点视图,不同之处在于默认情况下它对选定方法汇总总时间而不是自耗时 (self-time),而热点视图只显示自耗时占总时间显著比例的方法。在视图顶部有一个名为 汇总模式 (Summation mode) 的单选按钮组,可以切换为 自耗时 (Self times)。选择后,选定方法的汇总值会与热点视图默认模式一致。

在回溯路径中,回溯节点上的调用次数和时间仅与选定方法相关。它们显示了该特定调用栈对选定方法数值的贡献。与“计算累计外部调用”分析类似,你可以折叠递归,并且回溯路径的第一层等同于方法调用图中的传入调用。

调用图中的调用树分析

在调用图中,每个方法都是唯一的,而在调用树中,方法可能出现在多个调用栈中。对于选定方法,“计算累计外部调用”和“计算回溯路径”分析在调用树和调用图视角之间架起了桥梁。它们将选定方法置于中心,并以树的形式展示外部和传入调用。通过 显示调用图 (Show Call Graph) 操作,可以随时切换到完整的图形视图。

有时,你可能希望反向切换视角,从图形切换到树视图。当你在调用图中工作时,可以对图中的任意选定节点,使用与调用图中相同的调用树分析,将累计外部调用和回溯路径以树的形式展示。

IntelliJ IDEA 集成中,编辑器边栏显示的调用图包含直接显示这些树的操作。

分配分析中显示类

与前述调用树分析略有不同的是分配调用树和分配热点视图中的“显示类”分析。它不会将调用树转换为另一棵树,而是显示一个包含所有分配类的表格。结果视图类似于 已记录对象视图,但仅限于特定的分配点。

在显示调用树的分析结果视图中,“计算累计外部调用”和“计算到选定方法的回溯路径”分析均可用。执行这些操作会创建新的顶层分析,参数互不影响。前一个分析结果视图中的任何调用树移除操作都不会反映到新的顶层分析中。

另一方面,显示类 (Show Classes) 操作在调用树分析结果视图中使用时,不会创建新的顶层分析,而是创建一个嵌套分析,位于原始视图的下两级。