JProfiler帮助文档

JFR 快照中的视图 (Views)

除了 JFR 事件浏览器之外,JProfiler 还使用了一些可用于完整 profiling 会话 (session) 的视图 (view),并用 JFR 数据填充它们。这是可行的,因为 JFR 会收集内存分配 (allocation) 和方法执行的数据。主要限制在于记录速率较低,因此获取足够的数据来观察有问题的热点 (hot spot) 可能需要很长时间。

遥测 (Telemetry)

除“已记录对象遥测”外,完整 profiling 会话中的所有遥测 (telemetry) 也都可以在 JFR 快照中使用,但显示的数据存在某些限制。内存遥测不显示特定于 GC 的内存池,线程遥测不按线程状态显示线程数,已记录吞吐量遥测显示大小而非对象计数,并且不显示正在释放的对象。

下表显示了各种遥测 (telemetry) 使用的事件类型,以及它们是否在“default”和“profile”模板中均已启用。

遥测 (Telemetry) 事件类型 在 profile 中启用
内存 jdk.GCHeapSummary, jdk.MetaspaceSummary 全部
已记录吞吐量 jdk.ObjectAllocationSample, jdk.ObjectAllocationInNewTLAB, jdk.ObjectAllocationOutsideTLAB 仅限 profile
GC 活动 jdk.GarbageCollection 全部
类 jdk.ClassLoadingStatistics 全部
线程 jdk.JavaThreadStatistics 全部
CPU 负载 jdk.CPULoad 全部

内存视图 (Memory views)

在“内存”部分中,使用两种不同的事件类型来用数据填充视图 (view)。“活动对象”视图向您显示在一次 Full GC 后保留在堆上的所有类和实例计数的统计表示。仅当启用了 jdk.ObjectCount 事件时此数据才可用,而在默认的 JFR 模板中均未启用该事件,因为这会带来显著的开销。您还可以在高级 JFR 配置中通过“Garbage collector”下拉列表切换此设置。在 Java 17 之前,此下拉列表标记为“Memory profiling”。

如果快照中记录了多次 jdk.ObjectCount 事件,该视图将向您显示 jdk.ObjectCount 事件首次出现和最后一次出现之间的差异。这样,您可以了解记录期间数字的变化情况,并可能为内存泄漏提供某些线索。如果这些时间与快照记录的开始和结束点不一致,则会在遥测视图中添加相应的书签。仅包含对象总大小高于固定阈值(通常为堆的 1%)的类。

对于任何严肃的调查,请考虑使用完整 profiling 会话 (session)或获取 HPROF 快照。

“已记录对象”视图以及分配 (allocation) 视图向您显示自 Java 16 以来的 jdk.ObjectAllocationSample 事件以及较早 Java 版本中的 jdk.ObjectAllocationInNewTLAB 和 jdk.ObjectAllocationOutsideTLAB 事件的数据。高级 UI 中的“Allocation Profiling”下拉列表也提供了启用这些事件类型的方法。

与“活动对象”视图相反,它们仅显示在记录处于活动状态时分配 (allocated) 的对象。分配 (allocation) 由 JFR 进行采样,但报告的大小为总分配大小的估计值。由于这种差异,这些视图报告的大小并不对应于样本计数乘以平均实例大小。除此之外,这些视图的功能与完整 profiling 会话中的内存视图类似。

CPU 视图 (CPU views)

“CPU 视图”包括调用树 (call tree)、热点 (hot spot) 视图以及调用图 (call graph)。处于“Runnable”线程状态的数据基于两个标准 JFR 模板中默认记录的 jdk.ExecutionSample 事件。但是,采样率默认设置为 20 毫秒,对应于 JFR 高级 UI 中“Method sampling”设置的“Normal”选项。考虑到 JFR 仅采样极少数随机线程,获取足够的数据以使热点 (hot spot) 足够突出可能需要很长时间。如有必要,请考虑降低 jdk.ExecutionSample 的周期。请记住,这可能会导致快照大小变得非常大,因为 JFR 不会累积数据。

由于线程是零散采样的,因此无法像在完整 profiling 会话 (session) 中那样估计实际执行时间。在调用树 (call tree) 和热点 (hot spot) 视图中显示的不是时间,而是事件计数。这类似于具有相同缺点的异步采样。其他 JFR 线程状态为“Waiting”、“Blocking”以及“Socket and file I/O”,它们仍然测量时间。由于这种差异,线程状态选择器中不提供“All thread states”模式。

另一个考虑因素是,非 Runnable 线程状态是根据事件计算得出的,这些事件具有可配置的最小时长阈值,显示在线程状态选择器旁的工具提示中。这些线程状态的实际总时间可能会大得多。下表显示了用于组装线程状态的事件类型:

线程状态 事件类型
Runnable jdk.ExecutionSample
Waiting jdk.JavaMonitorWait, jdk.ThreadSleep, jdk.ThreadPark
Blocking jdk.JavaMonitorEnter
Socket and file I/O jdk.SocketRead, jdk.SocketWrite, jdk.FileRead, jdk.FileWrite

视图的功能在关于 CPU 视图的帮助主题中进行了说明。请注意,完整 profiling 会话的许多功能在 JFR 上下文中不可用。

线程和 Monitor 视图 (Thread and monitor views)

根据按时间顺序排列的方法采样数据,可以计算出线程历史视图,包括显示等待和阻塞时间的堆栈跟踪工具提示。

线程转储是 JFR 和 JProfiler 共有的一项功能,并显示在同一视图中。在这种情况下,事件浏览器不能替代它,因为它无法显示 jdk.ThreadDump 事件的线程转储列的结构化内容。在线程转储视图中,您还可以比较不同的线程转储。

探针 (Probes)

完整 profiling 会话中的某些 JVM 探针 (probe) 在 JFR 快照中具有等效的数据源。与事件浏览器相比,它们的主要优势在于结合了多个相关的事件类型。下表显示了可用探针及其用作数据源的事件类型。

探针 (Probe) 事件类型 在 profile 中启用
Socket jdk.SocketRead, jdk.SocketWrite 全部
文件 jdk.FileRead, jdk.FileWrite 全部
类 jdk.ClassLoad, jdk.ClassUnload, jdk.ClassDefine 无
异常 (Exception) jdk.JavaErrorThrow, jdk.JavaExceptionThrow 两者均包含 Error,两者均不包含 Exception
垃圾回收器 jdk.GarbageCollection, jdk.GCPhasePause, jdk.YoungGarbageCollection, jdk.OldGarbageCollection, jdk.GCReferenceStatistics, jdk.GCPhasePauseLevel<n>, jdk.GCHeapSummary, jdk.MetaspaceSummary, jdk.GCHeapConfiguration, jdk.GCConfiguration, jdk.YoungGenerationConfiguration, jdk.GCSurvivorConfiguration, jdk.GCTLABConfiguration 全部

类加载在高级 JFR UI 中有一个单独的复选框,可启用所有这三个类加载事件。

每个探针 (probe) 显示多个视图 (view)。与事件浏览器相比,其重点在于聚合数据,而不是单个事件。这也是 JProfiler 中的探针在概念上与 JFR 数据收集的不同之处。

除垃圾回收器探针外,所有探针都具有以下视图:调用树 (call tree) 和热点 (hot spot) 视图允许您选择单个线程或线程组以及聚合级别 (aggregation level)。默认情况下,显示所有线程,聚合级别设置为“Methods”。

遥测视图显示记录数据中的一个或多个遥测 (telemetry),并在概览页面中同时显示所有遥测。点击遥测名称即可打开完整的遥测。通过沿时间轴拖动,可以在事件视图中选择相应的事件。

事件视图类似于 JFR 浏览器中的视图。但是,它显示对应于底层 JFR 事件的多个事件类型,并提供类型选择器。单选和多选的过滤与堆栈跟踪显示的处理方式与事件浏览器中完全相同。此外,还有用于时间和内存测量的直方图视图,您可以通过沿水平轴拖动来选择范围。

垃圾回收器视图比较特殊,因为在 Java 17 或更高版本的 profiling 会话中,完整 profiling 会话可以显示完全相同的信息。当记录 JVM 探针类别中的垃圾回收器探针时,将使用 JFR 流 (stream) 来获取必要的数据。有关更多信息,请参见关于垃圾回收器分析的章节。