Ruby 2.2.1で解決されたSymbol GC のメモリリーク問題について

More than 3 years have passed since last update.

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

グラフにするとこのような形になります。

t_symbol_chart.png

シンボルのカウントが断然違うことがわかります。

バグを迅速に対応してくれるコミッターの方々には大変感謝いたします。


参考

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