rebuildfm 53のRubyのGCとスレッドの話が面白かった

Rebuild: 53: Less Code Is Better Code (Matz)

rebuildfm 53のRubyGCとスレッドの話が面白かったので書いてみる。

RubyGCというとクックパッドがユーザのリクエスト中にGCを止めるっていう話があったぐらいなので改善が望まれる分野なんだと思います。

例えば GC を止める・Ruby ウェブアプリケーションの高速化 - 2nd life

Rubyは2.1になって世代別GCが導入されるようになりました。その辺は下記に詳しいです。

WEB+DB PRESS Vol.79

WEB+DB PRESS Vol.79

  • 作者: 成瀬ゆい,そらは(福森匠大),西磨翁,小川航佑,佐藤新悟,塚越啓介,藤原亮,堀哲也,田村孝文,桑野章弘,松浦隼人,中村俊之,田中哲,福永亘,杉山仁則,伊藤直也,登尾徳誠,近藤宇智朗,若原祥正,松木雅幸,奥野幹也,後藤秀宣,羽二生厚美,笹田耕一,平河正博,東舘智浩,渡邊恵太,中島聡,A-Listers,はまちや2,川添貴生,山田育矢,伊藤友隆,村田賢太,まつもとゆきひろ,佐野岳人,山口恭兵,千葉俊輝,平松亮介,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2014/02/22
  • メディア: 大型本
  • この商品を含むブログ (5件) を見る

他の言語(例えばJava)ではとっくに導入されている世代別GCRuby 2.1になってようやく入りました。

世代別GCGC対象をnewとoldに分けてGCして効率化するというもの。oldがnewを参照している時にnewだけ見て誤ってGCしないようにリメンバーセットを使います。Rubyの場合に問題だったのはoldがnewを参照するのを検知するためのライトバリアをきちんと入れることが難しいというものでした。

世代別GCによって良くなったのですが、一部改善の余地があって、それは大きめの文字列オブジェクトとかがどんどん生成されて不要になるような状況で、生成されてすぐGCがはしるとすぐoldの方にいっちゃって不要なのにoldにいてメモリを圧迫するというものです。

この辺を解決するために現在開発中のRuby 2.2では2世代ではなく3世代別GCを検討しているようです。これならいきなり一番古いoldにいかないで2番目の世代にいって、そこでGCされるのでまだ効率的なんだとか。


Rubyのスレッドに関してはいろいろつぶやかれていたので、下記にまとめときました。

rebuildfm 53で話題になったRubyのスレッドに関係したつぶやき - Togetter


GCに関してはRubyJavaに近づいているような気もしますが、GILがあるスレッドはJavaとは全然別物ですね。Perlはそもそもスレッドがデフォルトオフみたいですね。