2016-09-08 9 views
0

私は、100sのキー値のペアを持つハッシュを持つ関数を持っています。 関数の最後にnilに設定すると、rubyはそのメモリを解放するか、この変数のガベージコレクションをより簡単にするのに役立ちますか?Ruby 2.xでのガベージコレクション

def func 
    hash ##a very big hash object 
    ##Processing 
    hash = nil 
end 
+0

はい。しかし、これは必要ありません。ハッシュはあなたの例のローカル変数であるため、とにかくガベージコレクションされます。 – spickermann

+0

これは時期尚早の最適化のようです。あなたは実際に記憶上の問題がありますか? – Stefan

+0

@Stefanはい、私たちは4つのsidekiqプロセスが再起動されるまで、ますます多くのメモリを消費するという問題があります。したがって、私たちは、非常に大きなオブジェクトの場合にのみ、効率的にメモリを管理するために、そのようなソリューションを検討しています – Divyanshu

答えて

2

いいえ、これらの100sのキーは、時​​間の経過とともにheap_lengthを増加させ、この参照を再割り当てすると変数にnilオブジェクトを指定すると、GCは呼び出されません。たとえあなたがGCを呼び出したとしても。この時点からheap_free_numの値は増加しますが、合計のheap_lengthは同じままです。参照変数nilを代入するとGCは、新しい変数を導入することによってheap_lengthを増やす必要がある場合や、新しいコードを呼び出す場合に必要となる場合にのみ呼び出されるため、ガベージコレクタを呼び出すことはありません。

+0

メモリ使用量がしきい値を超えた場合に備えて、ルビプロセスを再起動するためのGODスクリプトを設定しました – Divyanshu

0

ガベージコレクタは、範囲外になってそこから消去されます。 hash = nilを実行すると、単に参照ハッシュが変更され、(現在は不足している)オリジナルのハッシュがメモリ内に残ります。GCは、多数のクリーンアップメソッドによってコレクションを収集します。

0

まったくありません。

hash = nilへのこの[redundant]コール直後に、ローカル変数hashを定義するスコープが終了します。つまり、変数は範囲外になり、次回はGCがその仕事をしてくれます。それは収集されます。

もっと一般的な答えは、 "いいえ、変数をに設定するとGCには関係しませんが、ネストされたオブジェクトの参照カウンタは1だけ減少します。" hashにオブジェクトが含まれている場合、 hash(必ずしもnilである必要はなく、空のハッシュ/他の値でも良い)の値を変更すると、ネストされたオブジェクトの参照量がゼロになり、したがって、それらにガベージコレクションを強制する。

NB下記のJörgW Mittagの重要なコメントも参照してください。

+0

...参照カウンタもあると仮定すると、ほとんどのRuby実装では実際には当てはまりません。ほとんどのRubyの実装では、参照カウントではなくトレースGCが使用されます。 –

+0

@JörgWMittagああ、ありがとう、ありがとう。私は近くの言語であまりにも頻繁に言語を切り替えていたので、頭がおかしくなってしまった。ありがとう@untwal。 – mudasobwa

0

TL; DR:号

長い説明:

  1. 変数はとにかく方法の終了時にスコープの外に出ます。
  2. ガベージコレクタは、デッドオブジェクトが参照されなくなったときに、必ずしもデッドオブジェクトを収集するとは限りません。実際には、メモリの量やプログラムの実行時間によってはガベージコレクタが実行されないこともあり、オブジェクトをまったく収集しないこともあります。
  3. ガベージコレクタが実行されている場合でも、どのオブジェクトが収集されるかは保証されません。ガベージコレクタの中には、実行が許可される最大時間があり、その間にできるだけ多くのオブジェクトを収集するだけです。
  4. (これは明白なはずですが、繰り返しています)そのオブジェクトへの他の参照がある場合、最初はガベージコレクションの対象にはなりません。

Ruby言語仕様では、メモリの管理方法について何も言及していません。異なるRuby実装は、非常に異なるメモリ管理実装を使用する。 YARVは単純なマークスイープコレクタを使用し、RubiniusはImmixを使用し、JRuby、IronRuby、Topaz、Opalは独自のものでもなく、基盤となるプラットフォームのメモリ管理を使用します。 (JRubyの場合、HotSpotには4つのGCがあり、JRockitの場合は2、J9の場合は2です。)

関連する問題