过滤器和实时交互
在堆遍历器中寻找感兴趣的对象时,您通常会到达一个包含太多相同类实例的对象集。为了根据您的特定关注点进一步修剪对象集, 选择标准可以涉及它们的属性或引用。例如,您可能对包含特定属性的HTTP会话对象感兴趣。在堆遍历器的合并传出引用视图中, 您可以执行涉及整个对象集引用链的选择步骤。
然而,在您看到单个对象的传出引用视图中,提供了更强大的功能来进行约束引用和原始字段的选择步骤。
当您在传出引用视图中选择顶级对象、原始值或引用时,应用过滤器→通过限制所选值操作将被启用。 根据选择,过滤器值对话框提供不同的选项。无论您配置了什么选项,您总是隐式地添加约束,即新对象集中的对象必须具有类似于所选对象的传出引用链。 过滤器始终通过将当前对象集限制为可能更小的集合来作用于顶级对象。
在HPROF和JProfiler堆快照中,约束原始值均有效。对于引用类型,您可以要求JProfiler过滤非空值、空值和选定类的值。
通过toString()
方法的结果进行过滤仅在实时会话中可用,java.lang.String
和java.lang.Class
对象除外,
JProfiler可以自行解决。
最强大的过滤器类型是使用代码片段的过滤器。有两种根本不同的方法来过滤对象:
在实时会话中,JProfiler可以在被分析的JVM中运行过滤脚本并将实际实例传递给您的脚本。在由通过在实时对象上运行脚本应用过滤器显示的脚本编辑器中, 您可以编写一个直接访问属性的表达式或脚本,其布尔返回值决定实例是否应保留在当前对象集中。
当然,此功能只能在实时会话中工作,因为JProfiler需要访问实时对象。另一个需要考虑的因素是,在堆快照拍摄后,对象可能已被垃圾回收。 在这种情况下,当执行代码片段过滤器时,该对象将不会包含在新对象集中。
第二个选项也适用于快照,包括HPROF和PDH快照,是通过在转储数据上运行脚本应用过滤器操作。每个实例将作为
com.jprofiler.api.agent.heap.HeapObject
的实例传递给您的脚本。如果适用,您可以将参数向下转换为多个子接口。
请参阅Javadoc以获取更多信息。
例如,如果对象是对象实例并提供对字段值的访问,则com.jprofiler.api.agent.heap.Instance
接口可用。
如果脚本在顶级对象上运行并且当前对象集中的所有对象都是同一类型,则脚本参数将自动具有合适的子类型。
在这些过滤器脚本中,您还可以通过HeapObject
参数的方法访问所有传入和传出的引用。
请注意,PHD快照不包含字段信息,因此对于此类快照,所有实例都作为com.jprofiler.api.agent.heap.HeapObject
或
com.jprofiler.api.agent.heap.ClassObject
传递,字段值只能通过referencedObjects()
方法访问。
除了过滤器之外,传出引用视图中还有两个其他功能用于与单个对象交互:显示toString()值操作调用当前在视图中可见的所有对象的
toString()
方法,并直接在引用节点中显示它们。节点可能会变得很长,文本可能会被截断。使用上下文菜单中的显示节点详细信息操作
可以帮助您查看整个文本。
获取对象信息的一种更通用的方法是运行返回字符串的任意脚本。运行脚本操作位于显示toString()值操作旁边, 允许您在选择顶级对象或引用时执行此操作。脚本执行的结果显示在一个单独的对话框中。