GC は Ruby インタプリタの「ゴミ集め(Garbage Collection)」を制御するモジュールです。
Ruby 2.1ではRGenGCと呼ばれる新たなGCメカニズムが導入されました。それにともない、以下の環境変数が導入され、これらを設定することでGCの動作をチューニングすることができます。これらの環境変数の効果はRubyの起動時のみ有効です(つまりrubyを動かしている途中で変更することはできません)。
以下の2つの環境変数はobsoleteであり、新しいものを使うことが望ましい
RUBY_GC_HEAP_GROWTH_FACTOR と RUBY_GC_HEAP_FREE_SLOTS_GOAL_RATIO はともに GC後に空きスロットが少ないときにどれだけの量のメモリを新たに確保するかを決めるパラメータである。この2つのパラメータの優先順位は以下の通りである。
当然、RUBY_GC_HEAP_GROWTH_MAX_SLOTS はこれらより優先度が高いことに注意。
Rubyが利用するメモリはスロット以外にもある。例えば長い文字列は malloc によってCのヒープ上に確保される。GCはこのようなヒープ上のメモリを解放するためにも実行される。そこで、rubyでは malloc によるメモリ消費量を保持し、この消費量がある閾値を越えるとGCが起動される。また、GCが起動されるごとにこの消費量カウンタが0にリセットされる。
このカウンタは2種類あり、一方は malloc_increase_bytes、もう一方は oldmalloc_increase_bytes と呼ばれる。この2つの性質は以下のようになっている。
プログラム実行中には、GCに関する統計情報/閾値情報を GC.stat で見ることができるが、この文章で説明した以下の情報はこれで調べることができる。
@see ObjectSpace
count -> Integer
[permalink][rdoc]プロセス開始からガーベージコレクトを実行した回数を Integer で返します。
GC.count # => 3
disable -> bool
[permalink][rdoc]ガーベージコレクトを禁止します。
前回の禁止状態を返します(禁止されていたなら true, GC が有効であったなら、 false)。
GC.disable # => false
GC.disable # => true
[SEE_ALSO] GC.enable
enable -> bool
[permalink][rdoc]ガーベージコレクトを許可します。
前回の禁止状態を返します(禁止されていたなら true, GC が有効であったなら、 false)。
[SEE_ALSO] GC.disable
GC.disable # => false
GC.enable # => true
GC.enable # => false
latest_gc_info(result_hash = {}) -> Hash
[permalink][rdoc]latest_gc_info(key) -> object
最新のGCの情報を返します。
latest = GC.latest_gc_info
latest # => {:major_by=>nil, :gc_by=>:newobj, :have_finalizer=>false, :immediate_sweep=>false, :state=>:sweeping}
stat = GC.stat
merged = GC.latest_gc_info(stat)
merged == latest.merge(stat) # => true
GC.latest_gc_info(:gc_by) # => :newobj
start(full_mark: true, immediate_sweep: true) -> nil
[permalink][rdoc]ガーベージコレクトを開始します。
GC#garbage_collect や ObjectSpace.#garbage_collect と同じ働きをします。 GC.disable により GC が禁止されている場合でもガベージコレクトを開始します。
nil を返します。
注意: これらのキーワード引数は Ruby の実装やバージョンによって異なります。将来のバージョンとの互換性も保証されません。また、Ruby の実装がサポートしていない場合はキーワード引数を指定しても無視される可能性があります。
GC.count # => 3
GC.start # => nil
GC.count # => 4
stat(result_hash = {}) -> {Symbol => Integer}
[permalink][rdoc]stat(key) -> Numeric
GC 内部の統計情報を Hash で返します。
GC.stat # => { :count=>0, :heap_allocated_pages=>24, :heap_sorted_length=>24, :heap_allocatable_pages=>0, :heap_available_slots=>9783, :heap_live_slots=>7713, :heap_free_slots=>2070, :heap_final_slots=>0, :heap_marked_slots=>0, :heap_swept_slots=>0, :heap_eden_pages=>24, :heap_tomb_pages=>0, :total_allocated_pages=>24, :total_freed_pages=>0, :total_allocated_objects=>7796, :total_freed_objects=>83, :malloc_increase_bytes=>2389312, :malloc_increase_bytes_limit=>16777216, :minor_gc_count=>0, :major_gc_count=>0, :remembered_wb_unprotected_objects=>0, :remembered_wb_unprotected_objects_limit=>0, :old_objects=>0, :old_objects_limit=>0, :oldmalloc_increase_bytes=>2389760, :oldmalloc_increase_bytes_limit=>16777216 }
戻り値のハッシュは処理系に依存します。これは将来変更になるかもしれません。
本メソッドは C Ruby 以外では動作しません。
stress -> bool
[permalink][rdoc]GCがストレスモードかどうかを返します。
真が設定されている場合は GC を行えるすべての機会に GC を行います。
[SEE_ALSO] GC.stress=
stress=(value)
[permalink][rdoc]GCのストレスモードを引数 value に設定します。引数 value が真に設定されている間は、GC を行えるすべての機会に GC を行います。
この機能はデバッグ用途に提供されています。ストレスモードを有効にするとプログラムのパフォーマンスが低下します。
マイナー GC を動作させる場合に指定します。
sweep を遅らせる(Lazy Sweep を行う)に指定します。
malloc/calloc/realloc の後でメジャーGCを動作させる場合に指定します。
GC.stress # => false
GC.stress = true
GC.stress # => true
[SEE_ALSO] GC.stress
garbage_collect(full_mark: true, immediate_sweep: true) -> nil
[permalink][rdoc]ガーベージコレクトを開始します。
GC.start や ObjectSpace.#garbage_collect と同じ働きをします。 GC.disable により GC が禁止されている場合でもガベージコレクトを開始します。
nil を返します。
注意: これらのキーワード引数は Ruby の実装やバージョンによって異なります。将来のバージョンとの互換性も保証されません。また、Ruby の実装がサポートしていない場合はキーワード引数を指定しても無視される可能性があります。
include GC
GC.count # => 3
garbage_collect
GC.count # => 4
INTERNAL_CONSTANTS -> {Symbol => Integer}
[permalink][rdoc]GC用内部定数の値を保持するハッシュテーブルです。
GC::INTERNAL_CONSTANTS # => {:RVALUE_SIZE=>40, :HEAP_PAGE_OBJ_LIMIT=>408, :HEAP_PAGE_BITMAP_SIZE=>56, :HEAP_PAGE_BITMAP_PLANES=>4}
OPTS -> [String]
[permalink][rdoc]コンパイル時に指定したGCのオプションです。
可能性があるオプション文字列は以下の通りです。
例:
GC::OPTS # => ["USE_RGENGC", "RGENGC_ESTIMATE_OLDMALLOC", "GC_ENABLE_LAZY_SWEEP"] # この場合、GCデバッグ機能やプロファイル機能は無効化されている