通过使用GC日志分析工具,一次又一次地看到一些有趣的GC收集模式。基于GC收集模式,您可以即时检测应用程序的健康和性能特征。在这篇文章中,让我分享一些有趣的GC收集模式。
1.健康的锯齿状
![01af314aa035120f63bdf32e31bc7b75.png](https://i-blog.csdnimg.cn/blog_migrate/031d3b642fbbdce1d48d87b161fb5c64.png)
当应用程序健康时,您将看到一个漂亮的锯齿 GC 模式,如上图所示。堆使用量将不断上升;一旦触发Full GC事件,堆使用量将一直下降到底部。
在图 1 中,您可以注意到,当堆使用量达到 ~5.8GB 时,Full GC 事件(红色三角形)被触发。当Full GC事件运行时,内存利用率一直下降到最低点,即~200MB。请参见图中的黑色虚线箭头线。它表明应用程序处于健康状态并且没有遇到任何类型的内存问题。
2.重缓存模式
![9a73da9237c7fc14ffd0a8a6a87ff5a5.png](https://i-blog.csdnimg.cn/blog_migrate/815a422cb0966586ef346860ff637154.png)
当应用程序在内存中缓存许多对象时,GC 事件将无法将堆使用率一直降低到图的底部(就像您在早期的“健康锯齿”模式中看到的那样)。
在图 2 中,您可以注意到堆使用量不断增长。当它达到约 60GB 时,GC 事件(在图中显示为绿色小方块)被触发。但是,这些 GC 事件无法将堆使用量降至 ~38GB 以下。请参考图中黑色虚线箭头线。相比之下,在早期的“健康锯齿模式”中,您可以看到堆使用量一直下降到底部约 200MB。当您看到这种模式时(即堆使用率一直没有下降到底部),则表明应用程序正在内存中缓存大量对象。
当您看到这种模式时,您可能想要使用堆转储分析工具(如yCrash、HeapHero、Eclipse MAT )调查应用程序的堆,并确定是否需要在内存中缓存这么多对象。通过分析您可能会发现要缓存中存在不必要的对象。
3. 内存泄漏模式
一些应用程序受到这种
严重内存泄漏模式
的影响。堆使用量会缓慢上升,最终导致 OutOfMemoryError。
在图 3 中,您可以注意到当堆使用量达到约 43GB 时触发Full GC(红色三角形)事件。在图中,您还可以观察到 full GC 事件可以收集的堆大小一段时间内开始下降。
当第一个 Full GC 事件运行时,堆使用量下降到 22GB
当第二个 Full GC 事件运行时,堆使用量仅下降到 25GB
当第三个 Full GC 事件运行时,堆使用量仅下降到 26GB
当最终的 full GC 事件运行时,堆使用量仅下降到 31GB
请参见图中的黑色虚线箭头线。您可以注意到堆使用量逐渐上升。如果此应用程序运行较长时间(数天/数周),它将遇到 OutOfMemoryError
4.连续 Full GC 模式
![326571b65cfe1e4833d733ee59d3a929.png](https://i-blog.csdnimg.cn/blog_migrate/ad8e43bde1d4bd98af64ea175b78ed61.png)
当应用程序的流量增加到超过 JVM 的处理能力时,这种连续全 GC 模式将变得普遍。
在图 4 中,请参考图中的黑色箭头标记。12:02 到 12:30,Full GC(即“红色三角形”)连续运行;但是,在该时间范围内,堆使用率并没有下降。这表明在该时间段内应用程序中的流量激增,因此应用程序开始生成更多对象,而垃圾收集无法跟上对象创建速度。因此,GC 事件开始连续运行。请注意,当一个 GC 事件运行时,它有两个副作用:
CPU 消耗会很高(因为 GC 会进行大量计算)。
整个应用程序将被暂停,客户端相应大幅度延迟。
因此,在这个时间范围内,即12 点 02 分到下午 12 点 30 分,由于 GC 事件连续运行,应用程序的 CPU 消耗会暴涨,客户端可能不会得到任何响应。当这种模式出现时,您可以尝试添加更多实例或者增加堆内存大小解决。
5.内存泄漏模式
![2c03556d019cabd410b9c99fee4e5224.png](https://i-blog.csdnimg.cn/blog_migrate/fcd8200065bff137e1f43340fc0760b6.png)
每当应用程序遇到内存问题时,您就会看到图 5 中的模式,请注意图中的黑色箭头标记。您可以注意到 Full GC(即“红色三角形”)事件持续运行。这种模式类似于之前的“连续完整 GC”模式,有一个明显的不同。在“连续完整 GC”模式中,一旦流量减少,应用程序将从重复的完整 GC 运行中恢复并返回到正常运行状态。但是,如果应用程序遇到内存泄漏,即使流量中断,它也不会恢复。恢复应用程序的唯一方法是重新启动应用程序。如果应用程序处于这种状态,您可以使用yCrash、HeapHero、Eclipse MAT 等工具诊断内存泄漏。
结论
如果你想观察你的GC收集模式,您一定要启用应用程序的GC日志(它不会给您的应用程序增加任何不可衡量的开销)并研究垃圾收集行为。
原文:https://blog.ycrash.io/2021/10/15/interesting-garbage-collection-patterns/#more-1316
推荐
原创不易,随手关注或者”在看“,诚挚感谢!