在我们的项目中,我们是您的sendgrid,用于发送电子邮件和延迟作业以用于队列,我将ruby升级到2.7,rails升级到6.0.3.6,延迟作业记录升级到4.1.6。升级后,我们注意到aws容器内存不足。想知道是不是因为内存泄漏。如果是因为内存泄漏,我需要使用什么探查器来确定内存泄漏?
huus2vyu1#
由于垃圾收集,ruby将永远不会出现c/c中出现的那种内存泄漏,在c/c中,程序本应释放不再需要但不需要的内存。可能发生的情况是内存失控,因为您保留了不需要的引用。通常,当您将内容保留在类示例集合中,但由于内容不需要或陈旧而不剔除列表时,会发生这种情况。另一个可能发生的事情是ruby内存管理和os内存分配器之间的交互。有一篇很好的文章,是什么导致了ruby内存膨胀,作者是赖洪丽。这可能是您可以做得很少的事情,因为它不是代码中的内存“泄漏”。ruby 2.7中添加了一个特性,解决了lai hongli文章中的问题。方法是 GC.compact 它不会自动调用,但会对ruby堆进行碎片整理。
GC.compact
mtb9vblg2#
调试这项任务并不容易。我通常使用rack mini profiler来完成这项工作,它可以是简单的,也可以是复杂的。今年的rails conf(2021)中有一个非常有用的视频,名为profiling,让你的rails应用程序更快——gannon mcgibbon,它展示了如何使用这个gem。
2条答案
按热度按时间huus2vyu1#
由于垃圾收集,ruby将永远不会出现c/c中出现的那种内存泄漏,在c/c中,程序本应释放不再需要但不需要的内存。
可能发生的情况是内存失控,因为您保留了不需要的引用。通常,当您将内容保留在类示例集合中,但由于内容不需要或陈旧而不剔除列表时,会发生这种情况。
另一个可能发生的事情是ruby内存管理和os内存分配器之间的交互。有一篇很好的文章,是什么导致了ruby内存膨胀,作者是赖洪丽。这可能是您可以做得很少的事情,因为它不是代码中的内存“泄漏”。
ruby 2.7中添加了一个特性,解决了lai hongli文章中的问题。方法是
GC.compact
它不会自动调用,但会对ruby堆进行碎片整理。mtb9vblg2#
调试这项任务并不容易。我通常使用rack mini profiler来完成这项工作,它可以是简单的,也可以是复杂的。
今年的rails conf(2021)中有一个非常有用的视频,名为profiling,让你的rails应用程序更快——gannon mcgibbon,它展示了如何使用这个gem。