垃圾收集器分析
理解和分析垃圾收集器(GC)的运行时特性很重要。首先,GC暂停会直接影响应用程序的响应性。 通过了解垃圾收集器的性能,可以优化其设置以减少这些暂停。 通常,频繁且长时间的GC周期可能表明堆太小,或者创建了太多临时对象。
借助垃圾收集器探针,可以解决这些问题,并在调整JVM设置时做出更明智的决策,例如选择合适的垃圾收集器、堆大小或其他JVM参数。
垃圾收集器探针与其他探针有不同的视图,并使用不同的数据源。 它不是从JVM的分析接口获取数据,而是使用JFR流来分析来自JDK Flight Recorder的GC相关事件。 由于依赖于JFR事件流,GC探针仅在分析Java 17或更高版本的Hotspot JVM时可用。 当你打开JFR快照时,无论使用的Java版本如何,都会提供相同的探针。
垃圾收集视图
垃圾收集器探针中的主要视图是“垃圾收集”表。它将所有记录的垃圾收集显示为行,并将其最重要的指标显示为列。
“原因”列显示了触发垃圾收集的原因。例如,调用System.gc()
触发了完整的垃圾收集。
你可以从“收集器”列中关联的“G1Full”值中看到这一点。它还导致了20毫秒的显著暂停,这就是为什么通常不建议调用System.gc()
。
其他原因触发了年轻代空间的收集(“G1New”)或G1收集器的旧GC收集(“G1Old”),清理旧代中未引用的对象。
你可以看到旧GC收集的时间通常比年轻代收集的时间长,尽管年轻代收集的对象更多。
具有特殊GC处理的收集引用在单独的列中显示为“final”、“weak”、“soft”和“phantom”引用。
之所以有最长暂停和暂停总和的单独列,是因为每次垃圾收集由多个阶段组成,这些阶段会产生单独的暂停。 此外,垃圾收集的“持续时间”不等于暂停总和,因为垃圾收集在执行时仅部分暂停JVM。 你可以看到截图中的“G1Old”收集仅暂停了其持续时间的五分之一。
要检查垃圾收集的各个阶段,可以切换“GC ID”列中的树图标。
在上面的截图中,G1收集器的混合GC收集(“G1Old”)已展开。你可以看到大部分时间花在“类卸载”上,这不会暂停JVM。 在右侧,你可以看到垃圾收集的进一步统计信息。在这里,使用的堆保持不变,而使用的元空间上升了0.1%。
每个收集器的阶段是不同的。在上面的截图中,显示了一个完整的收集。它花费了大量时间标记整个堆中的活动对象。 在收集结束时,使用的堆减少了15.7%,而元空间保持不变。
在分析垃圾收集时,过滤是比较不同垃圾收集子集的重要工具。在表的顶部,有一个过滤器选择器,可以让你选择任何列并配置相应的过滤器。 查看相似垃圾收集的更简单方法是使用表上的上下文菜单,并根据选定行中的列值选择过滤条件。
你可以添加多个过滤器以缩小感兴趣的垃圾收集范围。活动过滤器显示为表顶部的标签。 也可以从嵌套的GC阶段表中添加过滤器。
遥测
GC探针生成了一些遥测数据,这些数据在“遥测”探针视图中可用。
如果你对最小化GC暂停感兴趣,顶部的“最长暂停”遥测将是最有趣的。 你可以沿着遥测的时间轴拖动以在“垃圾收集”视图中选择相应的垃圾收集。 为了获得更好的垂直分辨率,你可以从顶部的下拉菜单中选择单个遥测,或通过单击遥测的名称。
在上面的截图中,你可以看到随时间的暂停总和。JProfiler通过构建记录数据的直方图来呈现可累加的测量值。 直方图的宽度取决于可用的水平空间,因此直方图的宽度会根据缩放级别和窗口的宽度(如果启用了“适应缩放”)而变化。 保持不变的是所有直方图下的总面积。
堆和元空间遥测基于你在展开垃圾收集时可以看到的统计数据。 这意味着数据不像完整分析会话中的内存遥测那样定期采样。 如果在某个时间段内没有发生垃圾收集,就不会有数据。 对于分配活动较少的JVM,沿时间轴可能会有长时间的图形仅在两个垃圾收集之间插值。
这些遥测中的每一个都有两条数据线:“GC前”和“GC后”。对于“使用的堆”遥测,差异通常很大。 在每个时间点,你可以通过比较两条数据线的值来查看垃圾收集完成了多少工作。 你可以查看工具提示以获取精确的值。对于“提交的堆”遥测和元空间遥测,两条线之间的差异通常很小。
如果你正在分析JFR快照,则在遥测部分的“内存”遥测中也使用了相同的
jdk.GCHeapSummary
JFR事件类型的数据。
但在这种情况下,“GC前”和“GC后”值都显示在同一条数据线上,数据不会像GC探针遥测那样聚合到每秒一次的粒度,因此图形会有所不同。
GC摘要
GC摘要显示了在整个记录期间聚合的测量值。 每个测量值提供垃圾收集的数量,以及平均值、最大值和总值。 最重要的数据在顶部是直接影响应用程序活性的“暂停时间”。
另一个顶级类别显示了所有收集的总时间,然后分为年轻和旧收集的两个子类别。
GC配置
当你调整垃圾收集器时,你可能希望检查可以显式设置或由垃圾收集器本身隐式设置的常见属性。
这些属性是所有垃圾收集器共有的,帮助你理解垃圾收集器之间的差异。
GC标志
最后,GC特定的标志让你了解垃圾收集器可以调整的属性,并让你检查它们的实际值。
“来源”列显示了标志是如何设置的。“默认”值未从标准设置中修改,而“自适应”标志已由垃圾收集器自动调整。 如果你在命令行上设置了特定的GC标志,它们将在来源中报告为“命令行”。