如何诊断内存泄漏|有趣的垃圾回收

bae5b4b15d9d3588fd6ff2482239a7b9.png通过使用GC日志分析工具,一次又一次地看到一些有趣的GC收集模式。基于GC收集模式,您可以即时检测应用程序的健康和性能特征。在这篇文章中,让我分享一些有趣的GC收集模式。

1.健康的锯齿状

01af314aa035120f63bdf32e31bc7b75.png
图 1:健康的锯齿 GC 模式

当应用程序健康时,您将看到一个漂亮的锯齿 GC 模式,如上图所示。堆使用量将不断上升;一旦触发Full GC事件,堆使用量将一直下降到底部。

在图 1 中,您可以注意到,当堆使用量达到 ~5.8GB 时,Full GC 事件(红色三角形)被触发。当Full GC事件运行时,内存利用率一直下降到最低点,即~200MB。请参见图中的黑色虚线箭头线。它表明应用程序处于健康状态并且没有遇到任何类型的内存问题。

2.重缓存模式

9a73da9237c7fc14ffd0a8a6a87ff5a5.png
图 2:重缓存 GC 模式

当应用程序在内存中缓存许多对象时,GC 事件将无法将堆使用率一直降低到图的底部(就像您在早期的“健康锯齿”模式中看到的那样)。

在图 2 中,您可以注意到堆使用量不断增长。当它达到约 60GB 时,GC 事件(在图中显示为绿色小方块)被触发。但是,这些 GC 事件无法将堆使用量降至 ~38GB 以下。请参考图中黑色虚线箭头线。相比之下,在早期的“健康锯齿模式”中,您可以看到堆使用量一直下降到底部约 200MB。当您看到这种模式时(即堆使用率一直没有下降到底部),则表明应用程序正在内存中缓存大量对象。

当您看到这种模式时,您可能想要使用堆转储分析工具(如yCrash、HeapHero、Eclipse MAT )调查应用程序的堆,并确定是否需要在内存中缓存这么多对象。通过分析您可能会发现要缓存中存在不必要的对象。

3. 内存泄漏模式

5451593c0577b387b1f3433011c1dad2.png一些应用程序受到这种严重内存泄漏模式的影响。堆使用量会缓慢上升,最终导致 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
图 4:连续 Full GC 模式

当应用程序的流量增加到超过 JVM 的处理能力时,这种连续全 GC 模式将变得普遍。

在图 4 中,请参考图中的黑色箭头标记。12:02 到 12:30,Full GC(即“红色三角形”)连续运行;但是,在该时间范围内,堆使用率并没有下降。这表明在该时间段内应用程序中的流量激增,因此应用程序开始生成更多对象,而垃圾收集无法跟上对象创建速度。因此,GC 事件开始连续运行。请注意,当一个 GC 事件运行时,它有两个副作用:

  • CPU 消耗会很高(因为 GC 会进行大量计算)。

  • 整个应用程序将被暂停,客户端相应大幅度延迟。

因此,在这个时间范围内,即12 点 02 分到下午 12 点 30 分,由于 GC 事件连续运行,应用程序的 CPU 消耗会暴涨,客户端可能不会得到任何响应。当这种模式出现时,您可以尝试添加更多实例或者增加堆内存大小解决。

5.内存泄漏模式

2c03556d019cabd410b9c99fee4e5224.png
图 5:内存泄漏 GC 模式

每当应用程序遇到内存问题时,您就会看到图 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

推荐

A Big Picture of Kubernetes

Kubernetes入门培训(内含PPT)


原创不易,随手关注或者”在看“,诚挚感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值