Blog chevron_right Java

在不牺牲性能的情况下充分利用 Java GC 日志记录

Get More from Java Garbage Collection Logs Without Sacrificing Performance

GC 日志记录对于诊断内存问题和优化基于 Java 的应用程序性能具有重要的参考价值。一些 Java 用户认为启用垃圾收集日志记录会对其性能指标产生重大影响,但实际上影响可能非常有限。了解 Azul 的 C4 收集器如何在不影响性能的情况下使垃圾收集日志记录更轻松、更安全且更具洞察力。

阅读有关 GC 日志和应用程序性能的更多信息。

Java 垃圾收集器 (GC) 是 Java 虚拟机 (JVM) 的关键部分。它控制内存的使用方式,并自动释放不再使用的对象占用的内存空间。当存储在内存中的对象对于程序而言变得“不可达”时,GC 会检测到它们并清理它们。 

每次发生收集事件时,GC 日志都会显示有关使用和回收了多少内存、花费了多长时间以及 JVM 是否必须暂停应用程序的关键细节。 

一些 Java 开发人员认为日志记录会产生额外的开销、占用磁盘空间或在高峰流量期间带来延迟。这些担忧通常是合理的,尤其是在性能至关重要的环境中。 

但 Azul Platform Prime 包含 Azul Zing,这是屡获殊荣的 OpenJDK 增强版本。借助 Prime,您可以以最低的成本在大规模环境中充分发挥 GC 日志的全部优势。 

常见的 GC 日志记录风险(以及 Azul 如何处理这些风险) 

启用 GC 日志记录后,每次 JVM 执行垃圾收集时,它都会将信息存储在日志文件中。 

类别 详细信息
GC 事件的类型  小型 GC:清理年轻代空间
大型 GC:清理老年代空间
全量 GC:清理整个堆空间 
时间  GC 事件开始的时间 
时长  GC 事件持续的时长 
内存量  每个内存池在 GC 事件前后使用的内存 
可用内存总量  每个内存池的可用内存总量 

在 Java 应用程序中启用 GC 日志记录对性能的影响通常微乎其微,在现代 JVM 中更是如此。但是,具体影响可能因 JVM 版本、使用的 GC 算法以及其他设置和细节而异。以下是您需要考虑的一些事实: 

  • 避免填充文件系统:Java 9 及更高版本默认启用日志文件轮转功能,并且只会写入 5 个日志片段,每个片段的大小为 20MB。 
  • 限制 I/O 操作:JC 日志直接写入磁盘。这会产生 I/O 操作,如果磁盘速度较慢或磁盘使用率较高,就会拖慢应用程序的运行速度。 
  • 内存缓冲:现代 JVM 通常会使用内存缓冲区存放 GC 日志。当缓冲区满时,日志会写入磁盘,以降低对 I/O 的影响。缓冲区会占用应用程序本来可以使用的内存。 
  • 查看详细 GC 日志:如果启用详细 GC 日志,您可能会注意到性能影响,因为记录和处理这些数据会消耗 CPU 资源。 
  • 享受安全点:所有 GC 日志记录活动都在应用程序执行过程中的“安全点”上进行,与常规 GC 活动引发的“全局暂停”次数相比,日志记录活动不会导致“全局暂停”次数的增多。 

然而,并非所有 JVM 都是一样的。Azul Zing 将 GC 日志记录提升到新的高度,为开发人员提供更深入的见解和更强大的控制,同时减少调优和开销。 

Azul 的 GC 日志记录 

Azul Platform Prime 使 GC 日志记录更简单、更智能、更安全。 

基于 OpenJDK 的运行时通常需要额外的标志(如 gc* 或 safepoint)才能获得完整的情况,而 Zing 与基于 OpenJDK 的运行时不同,它会自动包含带有单个标志的最有用的性能数据: 

-Xlog:gc:gc.log 

Zing 日志更进一步,包括:

  • 安全点活动:即使使用基本的 gc 标志,Zing 也包含所有 GC 暂停和安全点信息。 
  •  JIT 编译器行为:有助于诊断预热延迟或低效的编译路径。 
  •  系统指标:包括 CPU 和内存利用率、Linux 页面缓存统计数据和进程级详情。 
  •  容器和进程上下文:可以更轻松地将环境变化与 GC 行为关联起来。 
  •  堆外内存信息:诊断复杂系统中内存不足问题的必备工具。 

这些额外的上下文信息可以帮助开发人员更快地解决问题,减少调优猜测,并消除性能故障排除中代价高昂的反复试错。 

使用 C4 消除 GC 暂停 

Zing 是屡获殊荣的 OpenJDK 增强版本,包含在 Azul Platform Prime 中。Zing 基于 OpenJDK,经过 TCK 验证,可提供卓越的应用程序性能、响应速度和效率。它始终会记录安全点暂停,甚至还会记录 OpenJDK GC 日志中默认不显示的其他信息,如即时 (JIT) 编译器活动、CPU 和内存使用情况、Linux 页面缓存指标,以及其他一些常用于系统性能分析的指标。 

与标准 OpenJDK 运行时相比,Zing JVM 生成的 GC 日志提供了各种附加信息。 

  • 常规系统信息对于验证设置和其他配置(包括 GC 日志)非常有用。 
  • Java 堆信息包含有关垃圾收集和内存管理的详细信息。 
  • 堆外内存信息查看 Java 堆外分配的内存,有助于诊断内存不足错误和常规内存消耗。 
  • 进程、容器和系统信息收集有关 JVM 运行环境的持续信息,这对于了解 JVM 的运行状况以及将环境与其他已记录的应用程序活动关联起来非常有用。 
  • JIT 编译器信息提供有关 JIT 编译器的详细信息,包括 JVM 预热行为以及 JVM 何时准备好处理流量。  

实际结果:从洞察到影响 

Azul 客户已将 Zing 与 C4 收集器一起大规模投入使用,其结果不言而喻。

LMAX Group logo
LMAX 的运行速度比其他 Java 运行时快 48%,并通过消除 GC 引起的速度下降提高了订单完成率。
查看案例研究

Workday 在 18 个月内节省了原本用于 GC 性能调优和故障排除的 42,000 个工时
查看案例研究
Bids Trading logo
BIDS 显著提升性能,并在一年内将 GC 调优和变通方案的投入减少了 95%
查看案例研究

万事达卡为高吞吐量下以微秒级识别欺诈的系统每天消除了超过 10,000 次垃圾收集暂停
查看案例研究

助您更进一步的工具 

在启用 GC 日志的基础上,Azul 提供了丰富的工具,帮助用户深入理解相关数据: 

  • Azul GC 日志分析器:一种图形工具,可将日志转换为图表、时间线和趋势,涵盖 GC 活动、JIT 行为、系统统计数据等。 
  • jstat VisualVM补充 Zing 日志以进行交叉验证和实时监控的标准工具。 
  • 文档和支持:Azul 的 GC 日志记录文档包括格式细分和最佳实践,以充分利用记录的每个字节。 

无需权衡即可获得更深入的洞察 

如果您犹豫是否在生产中启用 Java GC 日志记录,现在是时候重新考虑了。借助 Platform Prime 中的 Azul Zing 和 C4 收集器,您可以获得所有详情,而不会受到任何干扰。更多数据、更少暂停、无需额外调优。 

无论您是在对事件排除故障、诊断内存泄漏还是调优性能,GC 日志都是必不可少的,而 Azul 可以让这一切变得轻松。 

准备好深入了解 JVM 性能了吗?

Teal CTA Band

More GC Logging

A new ebook is available.