调用树拆分
调用树是为相同调用栈的重复调用累积的。这是因为内存开销和需要合并数据以便于理解。然而,有时您可能希望在选定的点打破累积,以便可以单独查看调用树的部分。
JProfiler具有通过在调用栈中插入特殊节点来拆分调用树的概念,并显示从插入节点上方的方法调用中提取的语义信息。这些拆分节点允许您直接在调用树中查看额外的有效负载信息,并单独分析其包含的子树。每种拆分类型都可以通过上下文菜单中的操作动态合并和取消合并,并对拆分节点的总数进行限制,以便内存开销是有限的。
调用树拆分和探针
探针可以根据它们在选定的感兴趣方法中收集的信息拆分调用树。例如,“HTTP服务器”探针为每个不同的URL拆分调用树。在这种情况下,拆分是高度可配置的,因此您可以仅包含URL的所需部分、来自servlet上下文的其他信息,甚至可以生成多个拆分级别。
如果您编写自己的探针,可以使用 嵌入式和 注入式自定义探针系统以相同方式拆分调用树。
使用脚本拆分方法
探针可用的相同拆分功能可以直接在调用树中使用,通过使用脚本拆分方法操作。在下面的屏幕截图中,我们希望为JMS消息处理程序拆分调用树,以单独查看不同类型消息的处理。
您只需输入一个返回字符串的脚本,而不是编写探针。该字符串用于在选定方法处对调用树进行分组,并显示在拆分节点中。如果返回null
,则当前方法调用不会被拆分,并像往常一样添加到调用树中。
脚本可以访问许多参数。它传递了选定方法的类、非静态方法的实例以及所有方法参数。此外,您还可以获得一个ScriptContext
对象,用于存储数据。如果需要从同一脚本的先前调用中回忆一些值,可以在上下文中调用getObject/putObject
和getLong/putLong
方法。例如,您可能只想在第一次看到特定方法参数值时进行拆分。然后可以使用
if (scriptContext.getObject(text) != null) { scriptContext.putObject(text); return text; } else { return null; }
作为拆分脚本的一部分。
拆分节点插入在选定方法的下方。对于上面屏幕截图中的示例,我们现在可以分别看到每个JMS消息目的地的处理代码。
拆分位置绑定到方法,而不是选定的调用栈。如果相同的方法在调用树的其他地方出现,也将被拆分。如果使用合并拆分级别操作,所有拆分将合并为一个节点。该节点为您提供了再次取消合并拆分的机会。
如果生成了太多拆分,一个标记为封顶方法拆分的节点将包含所有进一步的拆分调用,累积为一个单一的树。通过节点中的超链接,您可以重置封顶计数器并记录更多的拆分节点。要永久增加最大拆分数,可以在配置文件设置中增加封顶。
要在创建拆分方法后编辑它们,请转到会话设置对话框。如果不再需要特定的拆分方法,但希望将其保留以备将来使用,可以通过脚本配置前的复选框禁用它。这比仅在调用树中合并它更好,因为记录开销可能很大。