次のような単純なオブジェクトがあるとします。
object = Object.new
私が知っているように、これはメモリ(RAM)にオブジェクトを作成します。
このオブジェクトをRAMから削除する方法はありますか?
基礎となるCコードをハッキングする以外に、いいえ。ガベージコレクションはランタイムによって管理されるため、心配する必要はありません。ここにきちんとあります 参照 アルゴリズムのRuby 2.0。
メモリ内のオブジェクトへの参照がなくなると、ガベージコレクターが機能します。元気です。
簡単な答えは、GC(ガベージコレクター)に任せることです。
その参照を削除する準備ができたら、object = nil
。また、object
を参照しないでください。
ガベージコレクターは最終的にそれを収集し、参照をクリアします。
(from Ruby site)
=== Implementation from GC
------------------------------------------------------------------------------
GC.start -> nil
GC.start(full_mark: true, immediate_sweep: true) -> nil
------------------------------------------------------------------------------
Initiates garbage collection, unless manually disabled.
This method is defined with keyword arguments that default to true:
def GC.start(full_mark: true, immediate_sweep: true); end
Use full_mark: false to perform a minor GC. Use immediate_sweep: false to
defer sweeping (use lazy sweep).
Note: These keyword arguments are implementation and version dependent. They
are not guaranteed to be future-compatible, and may be ignored if the
underlying implementation does not support them.
ほとんどの場合、Rubyはガベージコレクションを自動的に処理します。もちろん、いくつかのEdgeのケースがありますが、一般的なケースでは、一般的なRubyアプリケーションのガベージコレクションについて心配する必要はありません。
ガベージコレクションの実装の詳細は、Rubyのバージョンによって異なりますが、ひねりの対象となるノブはほとんどないため、ほとんどの目的では不要です。メモリ不足に陥った場合は、過剰なメモリ消費のsymptomを管理しようとするのではなく、設計上の決定を再評価することをお勧めします。
一般的に、Rubyは、オブジェクトがスコープ外になるか、参照されなくなったときに、ガベージコレクションのオブジェクトにマークを付けます。ただし、 Symbols などの一部のオブジェクトは収集されず、プログラムのランタイム全体にわたって持続します。
GC#start を使用してガベージコレクションを手動でトリガーできますが、Ruby内からCプログラムを使用する場合のようにメモリブロックを実際に解放することはできません。これを行う必要がある場合は、メモリを直接管理しようとするのではなく、基礎となるX/Y問題を解決することができます。
オブジェクトを明示的に破棄することはできません。 Rubyには自動メモリ管理があります。どこからも参照されなくなったオブジェクトは、インタプリタに組み込まれたガベージコレクタによって自動的に収集されます。
賢明な割り当て方法と、微調整に使用できるいくつかのツールについて読むには良い記事です。
http://merbist.com/2010/07/29/object-allocation-why-you-should-care/