2015/3/3にリリースされたRuby 2.2.1ですが、このバージョンでSymbol GCのメモリリーク問題が修正されています。
このバグは以下のコードを実行することで確認できます
require 'objspace'
require 'pp'
def sym_num; Symbol.all_symbols.size; end
x = 0
loop {
(x += 1).to_s.to_sym
if (x % 1000_000) == 0
pp ObjectSpace.count_objects
end
}
このコードから得られるパラメータの内、:T_SYMBOLの推移を2.2.0と2.2.1で比較してみました。
結果は以下のとおりです。
| シンボル数 | 2.2.0 | 2.2.1 |
|---|---|---|
| 1000000 | 172647 | 8722 |
| 2000000 | 288421 | 9826 |
| 3000000 | 282266 | 9969 |
| 4000000 | 295309 | 8535 |
| 5000000 | 294361 | 11162 |
| 6000000 | 157329 | 3843 |
| 7000000 | 302397 | 12555 |
| 8000000 | 345924 | 4906 |
| 9000000 | 257370 | 12841 |
| 10000000 | 163197 | 6667 |
グラフにするとこのような形になります。
シンボルのカウントが断然違うことがわかります。
バグを迅速に対応してくれるコミッターの方々には大変感謝いたします。
参考
https://www.ruby-lang.org/ja/news/2015/03/03/ruby-2-2-1-released/
https://bugs.ruby-lang.org/issues/10686
http://docs.ruby-lang.org/ja/2.1.0/method/ObjectSpace/m/count_objects.html
