JProfiler帮助文档

调用树分析


调用树显示了JProfiler所记录的实际调用堆栈。 在分析调用树时,有几个转换可以应用到调用树上,使其更易于解释。这些转换可能很耗时,并且会改变输出格式, 与调用树视图中的功能不兼容,因此会创建带有分析结果的新视图。

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

在调用树视图下面将创建一个嵌套视图。如果你再次调用相同的分析操作,该分析将被替换。 要同时保留多个分析结果,你可以将结果视图固定。在这种情况下,下一个相同类型的分析将创建一个新视图。

在实时会话中,结果视图不会与调用树一起更新,执行分析时才会显示数据。要对当前数据重新计算分析,请使用重新加载操作。 如果调用树本身必须重新计算,比如在分配树中禁用了自动更新,重新加载操作也会为调用树重新计算。

折叠递归

使用递归的编程风格会导致调用树难以分析。"折叠递归"调用树分析会计算出一个所有递归都被折叠的调用树。 调用树中当前选择的父节点作为分析的调用树根。 要分析整个调用树,请选择一个顶层节点。

当同一个方法已经在调用堆栈的更高处已经被调用,便认定定检测到递归。在这种情况下,子树会从调用树中移除, 并缝合到该方法的第一次调用。然后,调用树中的该节点会被添加一个前缀图标,其工具提示显示了递归的次数。 在该节点下面,来自不同深度的堆栈被合并。合并的堆栈数也会在工具提示中显示。折叠的递归总数会在顶部显示, 上面是为原始调用树设置的调用树参数信息。

对于简单的递归,合并堆栈的数量是递归次数加1。所以一个递归工具提示显示"1个递归"的节点会包含一棵树, 其节点的递归工具提示中会显示"2个合并堆栈"。在更复杂的情况下,递归是嵌套的,会产生重叠的合并调用树, 因此合并堆栈的数量因堆栈深度而异。

在从调用树中移除一个子树以合并到更高的位置时, 会插入一个特殊的 "移动的节点"占位符。

分析累积传出调用

在调用树中,你可以看到所选方法的传出调用,但只针对该方法被调用的一个特定调用栈。 同一个感兴趣的方法可能在不同的调用堆栈中被调用,为了获得更好的统计数据,分析所有这些调用的累计调用树通常是很有用。 "计算累积传出调用"分析显示了一个调用树,该树汇总了所选方法的所有传出调用,无论该方法是如何被调用的。

对于选定的方法,JProfiler收集其所有的顶层调用,而不考虑递归调用,并将它们累积到结果树中。 顶部显示了在该过程中累积了多少个这样的顶层调用点。

在视图的顶部,有一个复选框,可以折叠结果树中的递归,类似于"折叠递归"分析。如果折叠了递归, 顶层节点和第一层的传出调用会显示与方法调用图相同的数字。

计算回溯跟踪

"计算回溯跟踪"分析是对"计算累计传出调用"分析的补充。与后者一样,它汇总了所选方法的所有顶层调用,不考虑递归调用。 但是,它不显示传出调用,而是显示导致所选方法调用的回溯跟踪。调用发起于最深的节点,并向顶层的选定方法传递。

这个分析类似于热点视图,只是默认情况下,它对所选方法的总时间进行累加,而不是自时间, 而且热点视图只显示自身时间占总时间很大一部分的方法。在视图的顶部有一个单选按钮组求和模式, 可设置为 自身时间。在该选择下,所选方法的累加值与热点视图中的默认模式相匹配。

在回溯跟踪中,回溯跟踪节点上的调用次数和时间只与所选方法有关。它们显示了沿该特定调用堆栈的调用对所选方法的值的贡献度。 与"计算累计传出调用"分析类似,你可以折叠递归,回溯跟踪中的第一层级相当于方法调用图中的传入调用。

调用图中的调用树分析

在调用图中,每个方法都是唯一的,而在调用树中,方法可以出现在多个调用堆栈中。对于一个选定的方法, "计算累积传出调用"和"计算回溯跟踪"分析是调用树和调用图的视角之间的桥梁。它们将选定的方法置于中心位置, 并以树的形式显示传出和传入调用。使用显示调用图操作,你可以随时切换到全图。

有时,你想反方向切换视角,从图视图变为树视图,当你在调用图中工作时, 你可以为调用图中的任何选定方法以树的形式显示累积传出调用和回溯跟踪,与调用图中的调用树分析相同。

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

显示分配类

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

在显示调用树的分析结果视图中,"计算累积传出调用"和"计算所选方法的回溯跟踪"分析都是可用的。 调用它们会创建具有独立参数的新顶层分析。任何从上一个分析结果视图中删除的调用树都不会反映在新的顶层分析中。

显示类操作,另一方面,当从调用树分析结果视图中使用时,它不会创建新的顶层分析。 相反,它会在原始视图下创建一个两个层级的嵌套分析。