我正在使用Puma服务器和DelayedJob。 似乎每个工作所占用的内存都没有被释放,我慢慢得到一个膨胀,导致我重新启动我的dyno(Heroku)。
为什么dyno在执行作业之前不会返回相同的内存使用量数据?
任何强制释放它的方法?我试过调用GC,但它似乎没有帮助。
答案 0 :(得分:2)
您可能遇到以下问题之一。或实际上所有这些:
数字1 。这不是一个实际问题,而是对Ruby如何向操作系统释放内存的误解。简短回答:事实并非如此。答案很长:Ruby管理一个免费对象的内部列表。每当您的程序需要分配新对象时,它将从此空闲列表中获取这些对象。如果那里没有更多的对象,Ruby将从操作系统分配新的内存。当对象被垃圾收集时,它们会返回到空闲列表。所以Ruby仍然拥有分配的内存。为了更好地说明它,假设您的程序通常使用100 MB。在某些时候程序将分配1 GB,它将保留此内存,直到您重新启动它。
有一些很好的资源可以了解有关它的更多信息here和here。
您应该做的是增加动态尺寸并监控内存使用情况。它应该在某种程度上稳定下来。这将显示您正常的内存使用情况。
2号。您可能有实际的内存泄漏。它可以在您的代码中或某些宝石中。查看this repository,它包含有关流行宝石中众所周知的内存泄漏和其他内存问题的信息。 delayed_job
实际列在那里。
3号。您可能有未经优化的代码使用的内存超过了所需的内存,您应该尝试调查内存使用情况并尝试减少它。如果您正在处理大型文件,也许您应该以较小批量等方式进行处理。