えんじにぃーあぶろぐ

あまり長い文章は好きではないので、長い時間をかけないで読める、簡単な内容を目指すエンジニアのブログです。

ガベージコレクションの実装って考えること多い

さて、

 

最近遅く帰ることが多くなりました。

まぁ忙しい時期なので仕方ありませんが。

ブログは腐らず続けていきたいので、頑張って更新します。

 

 

 

今日はガベージコレクションGCについて簡単に書きます。

 

仕事で、あるシステムを作成していて、そこでGCのようなアルゴリズムを書いたので、ふと書こうかなと思いました。

 

 

 

 

 

 

 

 

 

 

ガベージコレクションとは?

ja.m.wikipedia.org

 

 

 wiki参照!以上!

 

 

  =====○)д`);.・;゛;ブッ 

   =====○)д`);.・;゛;ブッ 

    =====○)д`);.・;゛;ブッ 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

とりあえずでwiki見てみましたが、完成度高すぎてビックリしましたね(当たり前か)

アルゴリズムの種類、言語毎の実装アルゴリズムなどなど…

 

 

 

 

とりあえず話は戻って、

ガベージコレクションとは!

 

不要になって使わなくなったメモリ領域を開放する仕組みのこと

 

ですね。

 

最初にガベージコレクションを実装したのはlispだとかなんだとか。

 

ガベージコレクションは常にオブジェクトを見張っているため、

それなりに時間がかかる重い処理です。

 

C言語なんかはガベージコレクションを実装していない(ライブラリで追加可能)ので、そんじょそこらの言語よりは高速となっています。

それ故、組み込み系のシステムではC言語がよく使われていますね。

 

 

 

 

 

 

 

 

それではガベージコレクションって

どんなアルゴリズムで動いているのか?

 

代表的な例を記載しておきます。

 

 

 

 

 

 

 

 

 

 

 

 

リファレンスカウント

 

f:id:ygt1qa3:20190227232200j:plain

※時間制限ではなくカウント制ですし、爆発はしません。

 

予め、オブジェクトが参照される回数を記憶しておき、

その回数がゼロになったときにゼロになったオブジェクトを開放する方式

 

仕事で作成したGCもどきもこの方式を採用しています。

わりと単純なアルゴリズムですよね。

 

 

 

 

 

 

 

マークアンドスイープ

 

f:id:ygt1qa3:20190227234726j:plain

どこからも参照されていないオブジェクトを開放する方式

 

これは確か下記の本でも取り扱われていたアルゴリズムだったと思います、

これも単純かつ有名ですね。

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識

 

 ※この本わかりやすくておすすめです。プログラムが動く仕組みを知るって大事ですよね。

 

 

 

 

 

 

 

コピーGC

 

f:id:ygt1qa3:20190227234636j:plain

メモリ領域を二つ用意し、片方にオブジェクトをプールし、片方に使っているオブジェクトをコピーしてから、プールしてある領域を解放する方式 

 

これは実は知らなかったです。

 

 

 

 

2つの領域のうち、アプリが使えるのは片方のみで、

その使える片方にオブジェクトが溜まると、コピーGCの処理が走ります。

 

 そうすると、使っていないもう片方の領域に、

使用中のオブジェクトをコピーして、使っていた領域を解放します。

 

そして、コピー元とコピー先の領域を入れ替えて

再びオブジェクトがいっぱいになれば、同じことが起きる。

 

 

こんな感じのアルゴリズムらしいですね。

 

オブジェクトを順々にコピーしていくため、

メモリの断片化が起きないのがメリットらしいです。

 

中々面白いなぁと思いました。

 

 

他にも世代別GCというものもあり、

これはコピーGC+マークアンドスイープのアルゴリズムのようです。

なんとなくイメージは湧きますね!

 

 

 

 

 

 

 

 

 

 

 

 

アルゴリズムを知っておくと、思わぬところで役に立つので、

引き出しはたくさん持っておきたいですね。

 

アルゴリズムイントロダクションを完読しよう!