想在ROR中判断我们是否有内存泄漏

Want to determine whether we have memory leak in ROR

在我们的项目中,我们是您的 sendgrid,用于发送电子邮件和用于队列目的的延迟作业,我将 ruby 升级到 2.7,rails 到 6.0.3.6,delayed_job_active_record 到 4.1。 6.升级后,我们注意到 aws 容器内存不足。想知道是不是因为内存泄漏。如果是因为内存泄漏,我需要使用什么探查器来确定内存泄漏?

调试这不是一件容易的事。我通常使用 rack-mini-profiler 来完成工作,这可以是简单的也可以是复杂的。

今年的 Rails Conf (2021) 中有一个非常有用的视频,名为 Profiling to make your Rails app faster - Gannon McGibbon,展示了如何使用 gem。

由于垃圾收集,ruby 将永远不会出现 C/C++ 中程序本应释放不再需要但实际上没有释放的内存的那种内存泄漏。

可能会发生内存失控,因为您持有不需要的引用。通常,当您将事物保存在 class 实例集合中,但由于不需要或旧事物而不剔除列表时,通常会发生这种情况。

另一件可能发生的事情是 ruby 内存管理和 OS 内存分配器之间的交互。有一篇非常好的文章,Hongli Lai 的 What causes Ruby memory bloat 就此进行了介绍。这可能是您无能为力的事情,因为它不是代码中的内存“泄漏”。

ruby2.7 中添加了一项功能,解决了赖红利文章中的问题。该方法是 GC.compact,它不会自动调用,但会对 ruby 堆进行碎片整理。