Gettext 的內存泄漏 / Memory Leaks in Gettext

Rails 支持 L10N 的插件並不算非常多,而其中的 Gettext 由於 GNU 的緣故應該算是比較普遍的了。相信很多人在對 Rails 項目進行本地化的時候都會接觸過這個插件。

但是不知道有多少人在部署 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章