2009-07-13 10 views
7

httpはステートレスなので、アプリケーションへのリクエストごとに新しいオブジェクトが作成されます。 Railsは未使用のオブジェクトをどのくらいの頻度でクリーンアップしますか?Ruby/Railsガベージコレクション

答えて

12

単純な答え:Rubyのランタイムがガベージコレクタを持っています。実行時(JRuby/JVM世代GC、IronRuby/CLR世代GC、古典的Ruby /マークスイープGC)に応じて、異なるアルゴリズムが使用されます。しかし、基本はとてもシンプルです:割り振り要求の際

  • 「十分な空きメモリが」利用可能がある場合 - 不十分どのくらいあるGCアルゴリズムの成分の一つである - そして、GCが
  • 開始しますGCはグローバル変数とスタック位置(パラメータとローカル変数)であるルートをスキャンして、どのオブジェクトがまだ生存しているかを検出します。それは、それぞれが、それは次に
  • 見つけたオブジェクトをマーク、GCプロセスは、これらのオブジェクト内のリンク(参照)を見て、すべてのマークされたオブジェクトをコピー/すでに、その後の移動を開始することができ
  • GCをマークされていないそれらのオブジェクトに再帰しますメモリ内で圧縮されるようにする。
  • 新しい割り当てが発生したときの「フリーポインタ」は、この圧縮されたメモリチャンクの末尾にリセットされる。
  • まだ「空きメモリ不足」がある場合、moreが割り当てられるオペレーティングシステムから
  • スキャンプロセス中にマークされていないすべての古いオブジェクトはガベージであり、thから暗黙的に破棄されますコピー処理と空きポインタの再設定を行う。

収集頻度は、オペレーティングシステム、物理メモリの量、オペレーティングシステムのメモリ圧迫、ユーザーが調整できる調整、基本となるプラットフォームのバージョンの改訂、動的に最適化されたGCのチューニングに依存しますパラメータなどが含まれています。その多くは、 "不十分な空きメモリ"テストにバーがどこにあるかを決めるまでになりますが、世代別コレクタでは複雑になります。

関連する問題