Let`s Geek!!!

IT 関連の記事を投稿します.

Ruby の GC

はじめに

先日、このような記事

blog.codeship.com

を読み、GC について興味がわいたのでまとめてみます。

今回は、タイトルにある通り Ruby を用いて GC についてまとめます!!


GC とは??

まず根本的な「GC って??」というところから。

オブジェクトを新しく作成した時に、プログラムはコンピュータ上のメモリ領域を割り当てます。しかし、プログラムの途中で不要なオブジェクトが存在してしまいます。そのオブジェクトに割り当てた領域をプログラム終了時までメモリに残しておいたのでは、どんどん消費だけされてしまい、ただのメモリの無駄使いになってしまう・・・

そこで、不要になったオブジェクト(いわゆるゴミ)を自動に回収してメモリリークを減らすというのが GC の大まかな意義です。 ゴミ(garbage)を回収(collect)するので GC : Garbage Collection というわけです。


じゃあ参考記事について・・・

英語だったので少々(だいぶ?)心配なのですが、ご了承ください。

 

いきなりですが例です。

class Node
  def initialize(val)
    @value = val
  end
end

p Node.new(1)
p Node.new(2)

上記コードで Node.new(1) を実行したら Ruby はどのような動作をしているのか。

実はこれといって何もしていないそうです!!というのも Ruby はあらかじめ何千ものオブジェクトを作成し、それを freelist という連結リスト上に配置します。

イメージ的には以下の図のようです。

f:id:shaw-koike:20170401231554j:plain

そしてオブジェクトの作成を繰り返すことで・・・

f:id:shaw-koike:20170401233219j:plain

上図のように freelist は使い切られました。この時、RubyMark and sweep アルゴリズムを用いて汚染オブジェクトをマークします。 また、stop the world によってアプリケーションに処理を一時停止し、汚染オブジェクトを掃除(sweep)した結果が下図になります。

f:id:shaw-koike:20170401235800j:plain

このように、freelist に空きができ再度オブジェクトを作成する余裕が生まれるといった仕組みでした。


最後に

参考記事では、Mark and sweep について述べていたのでそのまま紹介しましたが今度は最近?話題の世代別 GC という別のアルゴリズムもまとめられたらな〜と思ってます。

最後に GC についてのオススメの本を下に紹介して終わりにしたいと思います。