JProfiler帮助文档

拆分调用树


调用树会对同一调用堆栈的重复调用进行累积。这是有必要的,由于内存开销和需要合并数据以使其易于理解。 然而,有时您希望在选定的点上打破累积,以便您可以分别查看调用树的部分内容。

JProfiler有一个拆分调用树的概念,是用特殊的节点拆分调用树,这些节点插入到调用堆栈中, 并显示从插入节点上方的方法调用中提取的语义信息。这些拆分节点允许你直接在调用树内部看到额外的有效载荷信息, 并分别分析其包含的子树。每种拆分类型都可以通过上下文菜单中的操作在运行中合并和取消合并, 并且拆分节点的总数有一个上限,因此可以限制内存开销。

调用树拆分和探针

探针可以根据它们在选定的感兴趣方法上收集的信息来拆分调用树。 例如,"HTTP服务器"探针会为每个不同的URL进行调用树拆分。这种情况下的拆分是高度可配置的,因此您可以只包含URL所需的部分, 也可以包含来自servlet上下文的一些其他信息,甚至可以产生多个拆分级别。

如果你自己写了探针,你可以以同样的方式拆分调用树,使用 嵌入式注入式自定义探针系统都可以。

用脚本拆分方法

在调用树中可以直接使用与探针相同的拆分功能,使用脚本拆分方法操作。 在下面的屏幕截图中,我们要拆分一个JMS消息处理程序的调用树,以便分别查看不同类型消息的处理情况。

代替写探针,你只需要输入一个返回字符串的脚本。该字符串用于在所选方法处对调用树进行分组,并显示在拆分节点中。 如果返回null ,当前的方法调用不会被拆分,而是像往常一样添加到调用树中。

该脚本可以访问一些参数。它被传递了所选方法的类,非静态方法的实例,以及所有方法参数。 此外,你还会得到一个ScriptContext 对象,可以用来存储数据。 如果你需要再次调用同一个脚本之前调用中的一些值,你可以在上下文中调用 getObject/putObjectgetLong/putLong方法。 例如,你可能只想为第一次看到的方法特定参数值做拆分,那么你可以使用

if (scriptContext.getObject(text) != null) {
    scriptContext.putObject(text);
    return text;
} else {
    return null;
}

作为拆分脚本的一部分。

拆分节点被插入到选定的方法下面。对于上面截图中的例子,我们现在分别看到每个JMS消息目的地的处理代码。

拆分位置是绑定到一个方法,而不是绑定到所选的调用堆栈。如果同一方法存在于调用树的其他地方,它也会被拆分。 如果你使用 合并拆分级别操作,所有的拆分将被合并到一个节点中。这个节点也可以让你再次取消合并拆分。

如果你生成了太多拆分,一个标有 超过的方法拆分将包含所有进一步的拆分调用,累积成一棵树。 通过节点中的超链接,你可以重置上限计数器,并记录更多的拆分节点。为了持久化增加最大拆分数上限,你可以在分析设置中增加上限。

要在创建拆分方法后编辑它们,请进入会话设置对话框。如果你不再需要某个特定的拆分方法,但又想保留它供将来使用, 你可以用脚本配置前面的复选框禁用它。这比直接将其合并在调用树中要好,因为记录开销可能很大。