同僚と私は、Ruby on Rails アプリケーションのメモリ リークを探している最中であり、次のようなコードが原因である可能性があるという最初の兆候がいくつかあります。
module Foo
class Bar
def self.example
@widgets ||= ::Widget::Factory.new
end
end
end
私たちの推測では、self.example
はクラス メソッドであるため、メモ化された のインスタンスを適切にガベージ コレクションできない可能性がありますWidget::Factory
。
これにより、バックグラウンド ワーカーの 1 つが実行されるたびにメモリ リークが発生すると考えられます。のインスタンスをスピンアップしているようですFoo::Bar
が、によって作成されたオブジェクトの割り当てを解除することはありませんWidget::Factory
。
MRI の GC がそのようなユースケースでどのように機能するかについての洞察を持っている人はいますか?