Develop with pleasure!

福岡でCloudとかBlockchainとか。

RubyとGC

RubyにもGCの仕組みが存在するが、その処理方法にマークスイープ法と呼ばれる手法が用いられている。

このGCが始まると、ルートから追跡可能なオブジェクト全てにマーキングをしヒープ領域全体を走査する。そしてマークの付いていないオブジェクトがゴミと判断され回収される。

この方法だと、生成されているオブジェクトが多ければ多いほど追跡に時間を要し、メモリ領域が大きくなるほどオブジェクトの回収に時間がかかる=システム規模が大きくなるほど、実行速度の問題が顕在化していく。

Javaのような世代別GCの場合、オブジェクト毎に世代管理され、通常若い世代のGC対象となるため、マークスイープ法のような問題が発生しない。リアルタイムJavaとか追求していくとまた別のGCの進化が見られるのかもしれない。

Rubyにおいても世代別GCの導入の検討等がされているようだが、まだ具体的な計画にはなっていないようだ。Rubyに世代別GCを導入して、それが本当にGCの性能向上につながるかどうかに疑問があるっぽい。

JRubyとかだと処理系は世代別GCなんだろうか?

あと、運用面を考慮するとJavaみたいにヒープサイズを指定できないのが辛い…。