JProfiler帮助文档

过滤器与实时交互

在 Heap Walker 中查找感兴趣的对象时,通常会得到一个包含过多同一类实例的对象集 (object set)。为了根据您的特定关注点进一步缩减该对象集 (object set),选择条件可以涉及它们的属性或引用。例如,您可能对包含特定属性的 HTTP 会话 (session) 对象感兴趣。在 Heap Walker 的合并出站引用视图 (view) 中,您可以执行涉及整个对象集 (object set) 的引用链的选择步骤。

然而,可以在其中查看各个对象的出站引用视图 (view) 提供了强大得多的功能,用于执行限制引用和基本类型字段的选择步骤。

当您在出站引用视图 (view) 中选择顶级对象、基本类型值或引用时,应用过滤器 (Apply Filter)→通过限制所选值 (By Restricting The Selected Value) 操作将变为可用。根据所选内容,过滤器值对话框会提供不同的选项。无论配置什么选项,您始终隐式添加了一个约束:新对象集 (object set) 中的对象必须具有类似于所选引用链的出站引用链。过滤器始终作用于顶级对象,将当前对象集限制为可能更小的集合。

限制基本类型值在 HPROF 和 JProfiler 堆快照中均可使用。对于引用类型,您可以让 JProfiler 过滤非 null 值、null 值以及所选类的值。按 toString() 方法的结果进行过滤仅在实时会话 (session) 中可用,但 java.lang.String 和 java.lang.Class 对象除外,JProfiler 可以自行查明这些对象的结果。

最强大的过滤器类型是使用代码片段的过滤器。有两种根本不同的过滤对象方式:

在实时会话 (session) 中,JProfiler 可以在被分析 (profiled) 的 JVM 中运行过滤脚本,并将实际实例传递给您的脚本。在通过 在活动对象上运行脚本以应用过滤器 (Apply filter by running a script on live objects) 显示的脚本编辑器中,您可以编写直接访问属性的表达式或脚本,其布尔返回值决定是否应在当前对象集 (object set) 中保留该实例。

显然,此功能仅适用于实时会话 (session),因为 JProfiler 需要访问活动对象。另一个需要考虑的因素是,在获取堆快照之后,对象可能已经被垃圾回收。在这种情况下,执行代码片段过滤器时,此类对象将不会包含在新对象集 (object set) 中。

第二种同样适用于快照(包括 HPROF 和 PHD 快照)的选项是 在转储数据上运行脚本以应用过滤器 (Apply filter by running a script on dumped data) 操作。每个实例都将作为 com.jprofiler.api.agent.heap.HeapObject 的实例传递给您的脚本。如果有适用的子接口,您可以将该参数向下转型为其子接口。有关更多信息,请查阅 Javadoc。例如,如果该对象是一个对象实例,则可以使用 com.jprofiler.api.agent.heap.Instance 接口,并提供对字段值的访问。如果脚本对顶级对象进行操作,且当前对象集 (object set) 中的所有对象类型相同,则脚本参数将自动具有合适的子类型。

在这些过滤脚本中,您还可以通过 HeapObject 参数的方法访问所有入站和出站引用。

请注意,PHD 快照不包含字段信息,因此对于此类快照,所有实例都将作为 com.jprofiler.api.agent.heap.HeapObject 或 com.jprofiler.api.agent.heap.ClassObject 传递,并且字段值只能通过 referencedObjects() 方法访问。

除了过滤器之外,出站引用视图 (view) 中还有另外两个用于与单个对象交互的功能:显示 toString() 值 (Show toString() Values) 操作会对视图 (view) 中当前可见的所有对象调用 toString() 方法,并直接在引用节点中显示它们。节点可能会变得非常长,文本可能会被截断。使用上下文菜单中的 显示节点详细信息 (Show Node Details) 操作有助于您查看完整文本。

比调用 toString() 方法更通用的从对象获取信息的方法是运行返回字符串的任意脚本。当选择顶级对象或引用时,显示 toString() 值 (Show toString() Values) 操作旁边的 运行脚本 (Run Script) 操作允许您执行此操作。脚本执行的结果将显示在一个单独的对话框中。