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