调用树 (call tree)显示了 JProfiler 记录的实际调用栈 (call stack)。在分析调用树时,可以对其应用几种转换以使其更易于解读。这些转换可能非常耗时,并且会改变输出格式,使其与调用树视图 (view) 中的功能不兼容,因此会创建包含分析结果的新视图。
要执行此类分析,请在调用树视图中选择一个节点,然后从工具栏或上下文菜单中选择一个调用树分析操作。
系统将在调用树视图下方创建一个嵌套视图。如果再次调用相同的分析操作,该分析将被替换。要同时保留多个分析结果,可以固定结果视图。在这种情况下,下一次执行相同类型的分析将创建一个新视图。对于已固定的视图,视图顶部会显示一个重命名按钮,可用于更改左侧视图选择器中显示的名称。
在实时会话 (session) 中,结果视图不会随调用树一起更新,而是显示进行分析时的数据。要针对当前数据重新计算分析,请使用重新加载操作。如果调用树本身必须重新计算(例如在禁用了自动更新的分配树中),重新加载操作也会一并处理。
调用树快照
“创建调用树快照 (Create Call Tree Snapshot)”分析只是创建当前调用树的静态副本。这对于在不保存和打开 JProfiler 快照的情况下比较不同的用例非常有用。此外,它还提供了一种在调用树仍在记录时使用其冻结副本进行工作的方法。
“创建调用树快照”分析仅在“CPU 视图”部分的“调用树”视图中可用。如果固定调用树快照视图,则可以同时拥有多个调用树快照。与其他分析不同,调用树快照保存在 JProfiler 快照中,因为它们构成了独立的数据集。
除了可用于调用树视图的调用树分析之外,调用树快照还具有“计算热点 (Calculate Hot Spots)”操作,用于计算父视图的热点 (hot spot),类似于“CPU 视图”部分的“热点”视图。从调用树快照视图下方嵌套的视图中访问的所有分析,均使用来自其父调用树快照的数据,而不是来自顶层调用树视图的数据。
折叠递归
使用递归的编程风格会导致调用树难以分析。“折叠递归 (Collapse Recursions)”调用树分析会计算一个折叠了所有递归的调用树。调用树中当前选择的父节点用作该分析的调用树根。要分析整个调用树,请选择顶层节点之一。
当在调用栈中较高的位置已经调用了相同的方法时,系统将检测到递归。在这种情况下,该子树将从调用树中移除,并重新缝合到该方法的第一次调用处。然后,调用树中的该节点前面会带有一个图标,其工具提示显示递归次数。在该节点下方,来自不同深度的栈将被合并。合并栈的数量也会显示在工具提示中。折叠递归的总数显示在标题中,位于为原始调用树设置的调用树参数信息上方。
对于简单递归,合并栈的数量等于递归次数加一。因此,递归工具提示显示“1 recursion”的节点将包含一个树,其节点的递归工具提示显示“2 merged stacks”。在更复杂的情况下,递归是嵌套的并产生重叠的合并调用树,因此合并栈的数量因栈深度而异。
在子树从调用树中移除以合并到更高位置的点处,会插入一个特殊的 “已移动节点 (moved nodes)”占位符。
分析累计传出调用
在调用树中,您可以查看所选方法的传出调用,但仅针对调用了该方法的某个特定调用栈。感兴趣的同一方法可能在不同的调用栈中被调用,为了获得更好的统计信息,分析所有这些调用的累计调用树通常很有用。“计算累计传出调用 (Calculate cumulated outgoing calls)”分析显示一个调用树,无论该方法是如何被调用的,它都会汇总所选方法的所有传出调用。
对于所选方法,JProfiler 收集其所有顶层调用(不考虑递归调用),并在结果树中对它们进行累计。标题显示在该过程中汇总了多少个这样的顶层调用点 (call-site)。
在视图顶部,有一个复选框允许您在结果树中折叠递归,类似于“折叠递归”分析。如果折叠了递归,则顶层节点和第一层传出调用将显示与方法调用图 (call graph) 相同的数值。
计算回溯
“计算回溯 (Calculate backtraces)”分析是对“计算累计传出调用”分析的补充。与后者一样,它汇总所选方法的所有顶层调用,而不考虑递归调用。但是,它显示的不是传出调用,而是构成所选方法调用的回溯路径。调用始于最深层的节点,并向上推进到顶部的所选方法。
该分析类似于热点视图,只是默认情况下它汇总所选方法的总时间而不是自耗时 (self-time),并且热点视图仅显示自耗时占总时间显著比例的方法。视图顶部有一个标记为 Summation mode 的单选按钮组,可以设置为 Self times。选中该选项后,所选方法的汇总值与热点视图中默认模式的值相匹配。
在回溯中,回溯节点上的调用次数和时间仅与所选方法相关。它们显示了沿该特定调用栈的调用对所选方法的值贡献了多少。与“计算累计传出调用”分析类似,您可以折叠递归,并且回溯中的第一层等效于方法调用图中的传入调用。
调用图中的调用树分析
在调用图 (call graph) 中,每个方法都是唯一的,而在调用树中,方法可以出现在多个调用栈中。对于一个选定的方法,“计算累计传出调用 (Calculate Cumulated Outgoing Calls)”和“计算到所选方法的回溯 (Calculate Backtraces To Selected Method)”分析是调用树和调用图视角之间的桥梁。它们将所选方法置于中心,并将传出和传入调用显示为树。使用 Show Call Graph 操作,您可以随时切换到完整图形 (graph)。
有时,您希望朝相反的方向切换视角,从图形切换到树视图。在调用图中工作时,您可以使用与调用树中相同的调用树分析,将图形中任意选定节点的累计传出调用和回溯显示为树。
在 IntelliJ IDEA 集成中,编辑器装订线 (gutter) 中显示的调用图包含直接显示这些树的操作。
显示分配的类
与前面的调用树分析略有不同的是分配 (allocation) 调用树和分配热点视图中的“显示类 (Show classes)”分析。它不会将调用树转换为另一棵树,而是显示一个包含所有已分配 (allocated) 类的表格。结果视图类似于已记录对象视图,但仅限于特定的分配点。
在显示调用树的分析结果视图中,“计算累计传出调用”和“计算到所选方法的回溯”分析均可用。调用它们会创建具有独立参数的新顶层分析。之前分析结果视图中的任何调用树移除项都不会反映在新的顶层分析中。
另一方面,从调用树分析结果视图中使用 Show Classes 操作时,不会创建新的顶层分析。相反,它会创建一个比原始视图低两个级别的嵌套分析。

















