2017-03-08 93 views
0

我正在使用Puma服务器和DelayedJob。 似乎每个工作所占用的内存都没有释放,而且我慢慢地发生膨胀,导致我重新启动我的dyno(Heroku)。DelayedJob不释放内存

任何理由进行作业前的赛道将不会返回到相同的内存使用数字?

任何方式强制释放它?我尝试过调用GC,但它似乎没有帮助。

回答

1

您可能遇到以下问题之一。或者实际上所有的人:

1号。这不是一个实际的问题,而是关于Ruby如何向操作系统释放内存的误解。简短的回答:它没有。长答案:Ruby管理一个免费对象的内部列表。只要你的程序需要分配新对象,它就会从这个空闲列表中获得这些对象。如果在那里没有更多的对象,Ruby将从操作系统分配新的内存。当对象被垃圾收集后,他们回到空闲列表。所以Ruby仍然有分配的内存。为了更好地说明这一点,假设您的程序通常使用100 MB。在某些时候,程序将分配1 GB,它将保存这个内存直到你重新启动它。

有更多地了解它herehere一些很好的资源。

你应该做的是提高你的测功机的大小并随时监视内存的使用情况。它应该稳定在某个水平。这会显示你正常的内存使用情况。

2号。你可以有一个实际的内存泄漏。它可以在你的代码或一些宝石中。查看this repository,它包含有关众所周知的内存泄漏和流行宝石中的其他内存问题的信息。 delayed_job实际上列在那里。

3号。您可能没有使用比所需内存更多的代码进行优化,您应该尝试调查内存使用情况并尝试减少内存使用量。如果您需要处理大型文件,也许你应该这样做在小批量等

+0

感谢您的答复米哈尔。我正在使用很多散列符号作为键。虽然这些散列不再被引用,但切换到字符串键可能会有用吗?由于符号对垃圾收集更具弹性? –