2017-03-08 129 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

感謝您的答覆米哈爾。我正在使用很多散列符號作爲鍵。雖然這些散列不再被引用,但切換到字符串鍵可能會有用嗎?由於符號對垃圾收集更具彈性? –