但是不知道有多少人在部署 Rails 項目的時候留意過 mongrel 的內存使用情況(這裏以 mongrel 舉例僅僅是因爲比較常見,其他部署方式也會有類似的情況)。至少在我的項目中,mongrel 佔用的內存會不停的增長,不得不把所有 mongrel 加入 monit 並把內存佔用作爲監視條件。
空閒的時候稍微分析過它的源代碼。導致內存泄漏的原因其實很簡單,插件內部使用一個 Class 的實例對象作爲 Hash 的 Key,這部分的資源沒有回收導致每次調用方法都會產生泄漏(bound_target)。雖然可以可以用 MonkeyPatching 的方式解決這個問題,但是我始終認爲這種方式會帶來不可預測的風險。
昨天想起以前做過的 GettextDb 的項目,於是檢查了一下 Gettext 的版本情況,發現最近升級的 [color=red][url=http://rubyforge.org/frs/?group_id=855]Gettext 1.91.0[/url][/color] 修復了這個漏洞,改用實例對象的 object_id 作爲 hash 的 key,避免了過多無法回收的對象產生的泄漏。
相關鏈接:[url=http://gettext.rubyforge.org]http://gettext.rubyforge.org[/url]
# how to install gettext gem
gem install gettext