1

README の例に従って匿名クラスを使用してステート マシンを動的に生成し始めたときに気付き始めたstate_machine gemのメモリ リークを追跡しようとしています。この要点は、私が最初に問題を発見した方法を示しています。

この gist にまとめたステート マシンの gem でヘルパー メソッドを定義する方法に問題を絞り込むことができました。

私の質問は、define_method匿名クラスがガベージ コレクションを取得しない原因となるブロックの動作は何ですか? これらの 3 行 (18 ~ 20) にコメントを付けると、問題が解決するようです。

ご指摘ありがとうございます。

更新: Ruby 2.0.0p195 を使用しています

4

1 に答える 1

1

この記事では、この問題について説明します。

主な欠点は、define_method がクロージャーを作成することです。クロージャーは大きなオブジェクトへの参照を保持でき、それらの大きなオブジェクトはガベージ コレクションされません。

于 2013-07-12T15:53:32.340 に答える