Oha*_*han 1 ruby memory-leaks ruby-on-rails heroku delayed-job
我正在使用 Puma 服务器和 DelayedJob。似乎每个作业占用的内存都没有被释放,我慢慢地变得臃肿,导致我重新启动我的dyno(Heroku)。
测功机在执行作业之前不会返回到相同的内存使用量有什么原因吗?
有什么办法强制释放吗?我尝试致电 GC 但似乎没有帮助。
您可能遇到以下问题之一。或者实际上全部:
1号。这不是一个实际问题,而是对 Ruby 如何向操作系统释放内存的误解。简短的回答:没有。长答案:Ruby 管理自由对象的内部列表。每当你的程序需要分配新对象时,它就会从这个空闲列表中获取这些对象。如果那里没有更多的对象,Ruby 将从操作系统分配新的内存。当对象被垃圾回收时,它们会返回到空闲列表。所以Ruby仍然拥有分配的内存。为了更好地说明这一点,假设您的程序通常使用 100 MB。当程序在某个时刻分配 1 GB 时,它将保留该内存直到您重新启动它。
你应该做的是增加你的dyno大小并随着时间的推移监控你的内存使用情况。它应该稳定在某个水平。这将显示您的正常内存使用情况。
2号。您可能会遇到实际的内存泄漏。它可以在您的代码中或某些 gem 中。查看此存储库,它包含有关流行 gem 中众所周知的内存泄漏和其他内存问题的信息。delayed_job
实际上列在那里。
3号。您可能有未优化的代码,使用的内存超出了所需的内存,您应该尝试调查内存使用情况并尝试减少内存使用情况。如果您正在处理大文件,也许您应该以较小的批次进行处理等。