■
RubyKaigi: Symbol GC
nariさん
NaCl
GC本はAmazonでは絶版。達人出版会で買ってね!
http://tatsu-zine.com/books/gcbook
SymbolはID。
:symbol
シンボルの落とし穴
シンボルがGCされるか?
他の言語をみても、されるのとされないのがある…
Rubyの場合
symbolはFrozen Stringを参照していて、global_symbolsというハッシュテーブルで管理されている。<- C言語の領域
C言語側ではIDで参照している。
GCの対象になっていない。
なぜシンボルがGCされないのか…
GCするとglobal_symbolsのエントリも削除する。
そうするとC extensionのなかでIDで参照しているものが迷子になり、不整合が発生する。
Rubyの世界で死んだSymbolがCの世界では生きている
どうするか?
Immortal SymbolとMotal symbolにわける
:sym -> Immortal
いままでとはあまり変わらないねー
"sym".to_sym -> Mortal
global_symbolsのなかで、IDではなく、symbolとして格納される
同名のImmortal symbolがある場合
Immortal symbolがあって、同名で"sym".to_symとかすると、ImmortalがMortalに化ける。