三四十年前,开发人员负责清理(即释放)他们在应用程序中创建的对象。商业应用程序非常复杂,具有不同的工作流程、用例和场景。即使开发人员在某种情况下错过释放对象,对象也会在内存中累积,导致内存泄漏。1995年引入Java时,它承诺自动垃圾回收。它通过将释放对象的责任从开发人员转移到Java虚拟机(JVM)来彻底改革了内存管理。整个产业都接纳了这个创新的观念,因为开发人员不再需要担心手动的内存管理。从那时起,自动垃圾回收已成为所有现代编程语言的默认特性。
在本文中,让我们探讨垃圾回收期间关键的性能指标:“GC吞吐量”(GC Throughput)。我们将了解其含义,以及在Java应用程序中的重要性以及对整体性能的影响。此外,我们将深入了解改进GC吞吐量的可行策略,实现对现代软件开发的益处。
什么是垃圾回收吞吐量?
每当自动垃圾回收事件运行时,它会暂停应用程序,以识别内存中的未引用对象并将其清除。在这个暂停期间,将不会处理任何客户交易。垃圾回收吞吐量表示应用程序的时间中有多少百分比花费在处理客户交易,有多少花费在垃圾回收活动中。例如,如果有人说他的应用程序的GC吞吐量为98%,这意味着他的应用程序花费98%的时间处理客户交易,其余的2%的时间处理垃圾回收活动。
高GC吞吐量是可取的,因为它表示应用程序在高效利用系统资源,从而最小化中断并提高整体性能。相反,低GC吞吐量可能会导致增加的垃圾回收暂停,影响应用程序的响应性并导致性能瓶颈。监控和优化GC吞吐量对于确保应用程序执行和响应顺畅至关重要。在接下来的部分,我们将探讨查找应用程序的GC吞吐量的方法,并了解如何解释结果以优化Java应用程序的性能。让我们深入了解吧!
如何查找您的应用程序的GC吞吐量
垃圾收集日志是研究GC性能的最佳来源。如果您的应用程序在JVM中运行,则可以启用GC日志记录,通过JVM参数详细说明的方式。启用GC日志记录后,让您的应用程序至少处理一天的流量,以观察高流量和低流量期间。之后,您可以将生成的GC日志文件上传到GC日志分析工具中,以获取有价值的见解。一些流行的GC日志分析工具包括GCeasy、IBM GC & Memory Visualizer、HP Jmeter和Garbage Cat。这些工具将报告GC吞吐量以及其他必要的GC指标。下面是来自GCeasy工具的摘录,展示了各种GC关键性能指标(KPI),包括GC吞吐量。
图:GCeasy工具报告的GC吞吐量GCeasy工具
垃圾回收吞吐量不佳的原因
垃圾回收吞吐量下降的原因可以分为三类:
- 性能问题
- 错误的GC调优
- 资源不足
让我们在本节详细审查这些类别的每个原因。
a.性能问题
当应用程序存在性能问题时,GC吞吐量将下降。以下是可能导致应用程序性能下降的潜在性能原因。
1.内存泄漏
图:由于内存泄漏而反复运行的GC事件
当应用程序存在内存泄漏时,垃圾回收事件会不断运行,而不会有效回收内存。在上图中,您可以注意到向右角落的红色三角形集群,指示GC事件正在不断运行。然而,内存利用率并不减少,这是内存泄漏的典型迹象。在这种情况下,GC事件消耗大部分应用程序的时间,导致GC吞吐量和整体性能显著下降。要解决内存泄漏问题,您可以参考这段视频剪辑:
解决内存泄漏。
2.连续的GC暂停