私は、100sのキー値のペアを持つハッシュを持つ関数を持っています。 関数の最後にnilに設定すると、rubyはそのメモリを解放するか、この変数のガベージコレクションをより簡単にするのに役立ちますか?Ruby 2.xでのガベージコレクション
def func
hash ##a very big hash object
##Processing
hash = nil
end
私は、100sのキー値のペアを持つハッシュを持つ関数を持っています。 関数の最後にnilに設定すると、rubyはそのメモリを解放するか、この変数のガベージコレクションをより簡単にするのに役立ちますか?Ruby 2.xでのガベージコレクション
def func
hash ##a very big hash object
##Processing
hash = nil
end
いいえ、これらの100sのキーは、時間の経過とともにheap_lengthを増加させ、この参照を再割り当てすると変数にnilオブジェクトを指定すると、GCは呼び出されません。たとえあなたがGCを呼び出したとしても。この時点からheap_free_numの値は増加しますが、合計のheap_lengthは同じままです。参照変数nilを代入するとGCは、新しい変数を導入することによってheap_lengthを増やす必要がある場合や、新しいコードを呼び出す場合に必要となる場合にのみ呼び出されるため、ガベージコレクタを呼び出すことはありません。
メモリ使用量がしきい値を超えた場合に備えて、ルビプロセスを再起動するためのGODスクリプトを設定しました – Divyanshu
ガベージコレクタは、範囲外になってそこから消去されます。 hash = nil
を実行すると、単に参照ハッシュが変更され、(現在は不足している)オリジナルのハッシュがメモリ内に残ります。GCは、多数のクリーンアップメソッドによってコレクションを収集します。
まったくありません。
hash = nil
へのこの[redundant]コール直後に、ローカル変数hash
を定義するスコープが終了します。つまり、変数は範囲外になり、次回はGC
がその仕事をしてくれます。それは収集されます。
もっと一般的な答えは、 "いいえ、変数をに設定するとGCには関係しませんが、ネストされたオブジェクトの参照カウンタは1だけ減少します。" hash
にオブジェクトが含まれている場合、 hash
(必ずしもnil
である必要はなく、空のハッシュ/他の値でも良い)の値を変更すると、ネストされたオブジェクトの参照量がゼロになり、したがって、それらにガベージコレクションを強制する。
NB下記のJörgW Mittagの重要なコメントも参照してください。
...参照カウンタもあると仮定すると、ほとんどのRuby実装では実際には当てはまりません。ほとんどのRubyの実装では、参照カウントではなくトレースGCが使用されます。 –
@JörgWMittagああ、ありがとう、ありがとう。私は近くの言語であまりにも頻繁に言語を切り替えていたので、頭がおかしくなってしまった。ありがとう@untwal。 – mudasobwa
TL; DR:号
長い説明:
Ruby言語仕様では、メモリの管理方法について何も言及していません。異なるRuby実装は、非常に異なるメモリ管理実装を使用する。 YARVは単純なマークスイープコレクタを使用し、RubiniusはImmixを使用し、JRuby、IronRuby、Topaz、Opalは独自のものでもなく、基盤となるプラットフォームのメモリ管理を使用します。 (JRubyの場合、HotSpotには4つのGCがあり、JRockitの場合は2、J9の場合は2です。)
はい。しかし、これは必要ありません。ハッシュはあなたの例のローカル変数であるため、とにかくガベージコレクションされます。 – spickermann
これは時期尚早の最適化のようです。あなたは実際に記憶上の問題がありますか? – Stefan
@Stefanはい、私たちは4つのsidekiqプロセスが再起動されるまで、ますます多くのメモリを消費するという問題があります。したがって、私たちは、非常に大きなオブジェクトの場合にのみ、効率的にメモリを管理するために、そのようなソリューションを検討しています – Divyanshu