当前位置:Java -> 垃圾收集分析: OpenJDK 和 GraalVM

垃圾收集分析: OpenJDK 和 GraalVM

在本文中,我们将比较OpenJDK和GraalVM的垃圾回收(GC)性能。 GraalVM是一个流行的开源JVM实现,具有在Java中作为本机映像运行应用程序的功能。除此之外,它还具有其他功能,如快速加载时间、紧凑的内存使用等。

在本文中,我们将比较GraalVM和OpenJDK的垃圾回收细节。

GraalVM中的垃圾收集器

GraalVM的并发、分代、大部分复制的收集器效率高、可伸缩,并最小化暂停。它将堆分为年轻代和老年代,更频繁地收集年轻代以提高性能。复制收集器将活动对象移动到堆的新部分,进一步提高性能。

Precision Time Calculator Application

此应用程序从诸如 time.google.comtime.facebook.com 的开放时间服务器获取时间。然后,它计算从这些时间服务器获取时间所需的平均时间。此平均时间是基于当前系统时间计算的。如果此平均时间与开放时间服务器时间不同,那么应用程序将在控制台上显示消息。此应用程序为每个时间服务器创建一个线程。请查看startMonitor()方法以获取更多信息。

以下是代码的链接

在这里,每个线程在while循环中运行,从开放时间服务器获取时间并连续显示信息。

研究垃圾收集行为

现在,让我们使用OpenJDK版本17.0和 GraalVM 17.0社区版在IntelliJ IDE中运行此代码约一小时。我们运行它是因为在生产环境中长时间运行应用程序时,它将会更加稳定。此外,我们通过启用GC日志记录来对垃圾收集进行分析。

启用GC日志记录

在IntelliJ IDEA编辑器中启用GC日志记录非常简单。我们可以在运行上述代码时通过传递一个开关到JVM参数来实现这一点。

  • -XX:+PrintGCDetails -Xloggc:openjdk-gc.log
  • -XX:+PrintGCDetails -Xloggc:gc_graal.log

完成这些操作后,应用程序的根目录将会有两个GC日志。我们将上传这些日志到GC日志分析工具gceasy进行进一步分析。

垃圾收集指标

报告中,有三个主要的关键过程指标。它们是:

1.  吞吐量

2.  延迟

3. FootPrint

我们将主要分析此报告中的GC吞吐量和延迟指标。

吞吐量是应用程序在给定时间内完成的工作量。延迟是单个垃圾回收事件所花费的时间。应该从以下三个方面来研究这一指标。它们如下:

  1. 平均GC时间
  2. 最大GC时间
  3. GC时间分布

注:您可以从网站获取有关这些主题的更多详细信息。

首先,我们将查看吞吐量指标。以下是OpenJDK和GraalVM的吞吐量。

     图1:由GCeasy生成的OpenJDK GC KPI

                                                            由gc生成的OpenJDK GC KPIeasy。

    图2:由GCeasy生成的GraalVM GC KPI

                                                          由gc生成的GraalVM GC KPIeasy。

1. 应用程序的吞吐量

从上面的图片中可以看出,gceasy工具提供了关于应用程序状态的准确信息。GC吞吐量为99.947%。垃圾回收吞吐量表示应用程序的时间中有多少百分比用于处理客户交易,有多少百分比用于进行垃圾回收活动。例如,如果有人说应用程序的GC吞吐量为99.947%,这意味着应用程序花费99.947%的时间处理客户交易,剩下的0.053%的时间用于进行垃圾回收活动。高GC吞吐量是理想的,因为它表示应用程序有效地利用系统资源,减少中断,提高整体性能。

我们将我们的代码运行了一小时,应用程序大部分时间表现良好。我们可以说整体健康状况非常好。

2. 应用程序的延迟 

这是GC事件运行垃圾回收过程所需的总时间。这里你要记住的一件事是,数值越低越好。如果平均暂停时间很高,我们需要了解应用程序移除垃圾所需的时间更多。 

3. GraalVM GC性能 

但是,我们将从gceasy报告中分析延迟和暂停时间。延迟主要根据GC暂停时间表示。报告中还有其他KPI,但我们主要关注GC暂停时间,因为OpenJDK和GraalVM的吞吐量几乎相同。 

       图 3:由GCeasy生成的Graal VM GC KPI

                                                            Graal VM GC KPI 由gceasy生成。


    图 4:由GCeasy生成的OpenJDK GC KPI

                                                         OpenJDK GC KPI 由gceasy生成。 

在上面的报告中,我们可以看到吞吐量略高于OpenJDK。这里并没有太大的差异。OpenJDK的性能几乎与GraalVM相同。但是如果你看延迟,平均暂停时间比OpenJDK的要低很多。这意味着GraalVM移除垃圾的速度比OpenJDK快。因此,我们需要了解为什么GraalVM的值较低。这是因为GraalVM使用了更好的垃圾收集器。我们将检查另一个度量来了解这种行为,这个度量被称为“暂停时间”。

暂停时间指的是执行垃圾回收过程时应用程序需要暂停的时间。在进行垃圾回收时,应用程序会暂停,直到GC活动结束。这段时间就叫做暂停时间。 

图 5:Graal VM GC暂停时间统计

                                              Graal VM GC暂停时间统计。 

以上是GraalVM的暂停时间。在GraalVM的情况下,这个值为450毫秒。

OpenJDK GC性能 

现在,我们将分析OpenJDK的暂停时间。查看下面的截图获取暂停时间。

图 6:由GCeasy生成的OpenJDK GC暂停时间统计

                                      OpenJDK GC暂停时间统计。 

在OpenJDK的情况下,这个值非常高,为2秒450毫秒。 

总结结果 

从上面的结果可以看出,GraalVM 在 GC 机制方面更加成熟。与 OpenJDK 相比,它能够快速移除不可达对象。您可以从 GC 报告中获取更多有关垃圾收集器的信息,并根据这些数据,可以将您的应用程序提升到下一个水平。

以下是报告链接:

注意:请注意,本文的目的是了解两个不同 JDK 平台的 GC 行为差异。

结论

我们分析了两个不同 JDK 平台的吞吐量和延迟。这两个应用程序的整体健康状况非常良好。但是,当比较不同的 KPI 时,GraalVM 的应用程序延迟表现更加有前途。gceasy.io 报告揭示了关于 GC 过程的大量信息。

推荐阅读: 百度面经(12)

本文链接: 垃圾收集分析: OpenJDK 和 GraalVM