JProfiler帮助文档

垃圾回收器分析


出于各种原因,理解和分析垃圾回收器(GC)的运行时(Runtime)特性是非常重要的。首先,GC暂停可以直接影响应用程序的响应性。 通过理解垃圾回收器的执行情况,你可以优化其设置,以减少这种暂停。一般来说,频繁的长GC周期,可能标明堆太小,或创建了太多的临时对象。

有了垃圾回收器探针的帮助,你可以解决这些问题,而且当你调整你的JVM设置时,可以作出更加明智的决定,例如, 选择合适的垃圾回收器,堆大小,或其他JVM参数。

垃圾回收器探针和其他探针相比,有着不同的视图,而且使用一个不同的数据源。它不从JVM的分析接口获取数据,而是使用 JFR流,分析来自JDK飞行记录器的GC相关事件。 由于对JFR事件流的依赖性,只有当你分析Hotspot JVM 上的 Java17 或更高的版本,GC探针才可用。 当你打开JFR快照时,无论使用的Java版本如何,都可以获得完全相同的探针。

垃圾回收视图

垃圾回收器探针的主视图是“垃圾回收”表格。将所有记录的垃圾回收按行显示,每一列是最重要的测量指标。

“起因(Cause)”列,向你展示一次垃圾回收是如何被触发的。例如,一个System.gc()调用触发一次完整的垃圾回收。 你可以看到“回收器(Collector)”列中的相关值“G1Full”。它也引起了一次显著的暂停,达到了20ms,这就是为什么通常不建议 调用System.gc()的原因。以及其他起因,触发回收年轻代空间的(“G1New”),或会将对象转换为老年代的G1回收器(“G1Old”) 的混合GC回收。你可以看到,混合回收总是比年轻代回收花费更长的时间,尽管年轻代回收,回收的对象更多。

通过特殊GC处理回收的引用,在单独的列中显示为“最终(final)”,”弱(weak)“,”软(soft)“,”虚(phantom)“引用。

分别显示最长暂停和总暂停的原因是,每次垃圾回收由多个阶段组成,这些阶段会产生单独的暂停。而且,”持续时间(Duration)“不等于 总暂停,因为在垃圾回收执行过程中只会部分暂停JVM。你可以看到截图中的”G1old“回收的暂停仅是持续时间的五分之一。

要检查垃圾回收的各个阶段,你可以切换"GC ID"列的树形图标。

在上面的截图中,展开了G1回收器("G1Old")的一个混合GC回收。你可以看到,大多数时间花费在了不需要暂停JVM的"类卸载"上。 在右侧,你可以看到垃圾回收的进一步统计信息。此处,已使用堆保持不变,而已使用元空间(metaspace)增加了0.1%。

每个回收器的阶段不一样。在上面的截图中,显示了一个完全回收(Full GC)。它花费了大量时间标记整个堆上的活动对象。 在回收结束时,堆使用减少了15.7%,而元空间(metaspace)没有变化。

在分析垃圾回收时,过滤是比较不同垃圾回收子集的重要工具。在表格的顶部,有一个过滤选择器,允许你选择任意列, 以及配置相应的过滤器。查看类似的垃圾回收的更简单方法是,使用表格上的上下文菜单,并选择一个基于所选行中列值的过滤条件。

你可以添加多个过滤器,缩小感兴趣的垃圾回收的范围。激活的过滤器会以标签的方式显示在表格的顶部。 也可以从嵌套的GC阶段表中添加过滤器。

遥测

GC探针生成许多遥测数据,这些数据可在“遥测”探针视图中使用。

如果你想要减少GC暂停,顶部的“最长暂停”会是你最感兴趣的部分。你可以沿着遥测的时间轴拖拽以选择“垃圾回收”视图中相应 的垃圾回收。对于垂直分辨率,你可以从顶部的下拉菜单中选择单个遥测,或点击遥测名称。

在上边的截图中,你可以看到暂停时间的总和。JProfiler通过构建一个记录数据的直方图,来呈现可求和的测量结果。 如果启用了“缩放以适应窗口”,因为箱(bin)宽依赖于可用横向空间,所以直方图的箱体(bin)会根据缩放级别,和窗口的宽度而变化 所有直方图箱体下方总区域保持不变。

堆和元空间(metaspace)的遥测,是基于你在展开垃圾回收时看到的统计数据。这意味着数据不像在完整分析会话中的内存遥测那样, 被定期采样。如果在一段时间范围内,没有发生垃圾回收,就没有数据。对于一个分配活动很少的JVM,在时间轴上可能会有很长的一段时间, 其中图只是被插入在两个垃圾回收之间。

每一个遥测都有两个数据行:“垃圾回收(GC)之前”和“垃圾回收(GC)之后”。对于“已使用堆”遥测,这两者相差很大。通过比较这两个 数据行的值,你可以看到每次垃圾回收执行了多少工作量。你可以查看工具提示以获取精确值。对于“分配的(Committed)堆”遥测和 元空间(metaspace)遥测,两行的差异很小。

如果你在分析JFR快照,那么来自jdk.GCHeapSummary JFR事件类型的相同数据也在遥测部分的“内存”遥测中被使用。然而,在这种情况下,“垃圾回收(GC)之前”和“垃圾回收(GC)之后” 的值都现在是同一个数据行上,数据不会像GC探针遥测那样聚合到每秒一次的粒度,因此,图会看起来不一样。

GC概要

GC概要向你展示,整个记录期间累积的测量。每个测量提供了垃圾回收的数量,以及平均值,最大值以及总和。 顶部最重要的数据是,“暂停时间”,它直接反映了你的应用程序的活跃度。

另一个顶级(top-level)分类显示了,所有回收的总时间,然后将其分为两个子类,年轻代和老年代的回收。

GC配置

当你调整垃圾回收器时,你可能想要检查可由垃圾回收器本身显式或隐式设置的常用属性。

这些属性对于所有垃圾回收器都是相同的,他们有助于你理解不同垃圾回收器的差异。

GC选项(Flags)

最后,GC指定选定让你了解,可以调整垃圾回收器的哪些属性,并允许你检查它们的实际值。

“源(Origin)”列显示了,该选项(flag)是如何被设置的。“默认(Default)”值尚未被从标准设置中修改,而“人体工程学(Ergonomic)”选项已 由垃圾回收器自动调整。如果你在命令行中设置了指定GC选项,他们会在源(Origin)列显示为“命令行(Command line)”。