ガベコレおいしい!!! (または いかにして 私がガベコレを研究にするのを諦めたか)
以下いいかげんだぞ! 信用するな!! 諦めてねえし!!!
ガーベジコレクション(以下GCとかガベコレとか略す)は大事。なんで大事かって言うと、動的メモリ領域*1の管理は開発における最大のボトルネックの一つだから。メモリ管理のためのコードのために頭使うところもそうだし、わかりにくいバグ入れちゃって、後から直さなきゃいけなくなった場合なんてもっと大変。だからもうさ、プログラマの力を信用するのは止めてGC使わせときゃもうちょっとだけ世界が幸せになれるんです。
でまあ実際各種スクリプト言語とかJavaとかD言語とか、最初からGCを前提としたプログラム言語も普及してるし、GCの重要性は鰻登りなのです。というか「重要なんだってば!」という意見がようやく市民権を得てきたのです。
というわけでまず、その辺のこととか調べるときに使った諸々へのリンク
- 一般教養としてのGarbage Collection
- PDF。日本語での入門レベルGC文書では一番まとまってる気がする
- GCアルゴリズム詳細解説
- 書いてることもそうだけど、あちこちへのポインタとしてとてもありがたい!
- http://www.hpl.hp.com/personal/Hans_Boehm/gc/
- Boehm先生のGCのページ。論文とかの情報とかものってる。
- ftp://ftp.cs.utexas.edu/pub/garbage/gcsurvey.ps
- Paul Wilson's サーベイ論文。基本的なGCアルゴリズムの解説と、それらがどの論文に書いてあるかがまとまってる。通読すると(この論文が出された1992年頃の)昨今のGC界隈の情勢とかわかるんじゃないですかね! あんま読んでない!
- Garbage Collection
- GCの教科書的一冊。すごい初歩的なところから、様々なアルゴリズムまで網羅している感じ。とても良さそう。英語だけど。
Garbage Collection: Algorithms for Automatic Dynamic Memory Management
- 作者: Richard Jones,Rafael Lins
- 出版社/メーカー: Wiley
- 発売日: 1996/08/16
- メディア: ハードカバー
- 購入: 1人 クリック: 34回
- この商品を含むブログ (20件) を見る
この辺から適当に辿ったWEBページやら論文とかを眺めたりしてるNow。とりあえず「一般教養としてのGarbage Collection」はわかりやすくて、お勉強云々ぬかしても普通におもしろかったのでみんな(って誰だ! 人類全部じゃね!)読むといいと思う。
学会
Garbage Collectionの学会 - hogeなlogにGC関連の学会をまとめてみました。最新の動向を知りたいなら学会とかをチェックするといいのではないでしょうか。
この辺に「ヒープってなにそれおいしいの!?」とかを挿入する予定
GCの動作例
たとえば以下のようなcプログラムを実行してみます。mallocがNULL返すか、10万回mallocを実行したらループを抜けて終了するみたいですね。
#include <stdio.h> #include <stdlib.h> #define SEG 100000 int main() { int *p; unsigned long count = 0; while(1) { if((p = malloc(SEG))==NULL) { fputs("no heap\n", stderr); break; } if(++count>100000) break; } printf("count: %d, heap: %llu\n", count, (unsigned long long)count*SEG); return 0; }
環境によって結果は違ってくるかもしれませんが、例えばこんな出力をします。
% gcc over.c -o over % ./over no heap count: 32050, heap: 3205000000
mallocさんが「10万回もできるかボケ、3205600000バイトもヒープ領域確保したんだから勘弁してくれ!」と悲鳴を上げてNULLを返して終了してしまいました。ではGC*2を使った以下のようなコードに書きかえてみます。
#include <stdio.h> #include <gc/gc.h> #define SEG 100000 int main() { int *p; unsigned long count = 0; while(1) { if((p = GC_malloc(SEG))==NULL) { fputs("no heap\n", stderr); break; } if(++count>100000) break; } printf("count: %d, heap: %llu\n", count, (unsigned long long)count*SEG); return 0; }
stdlib.hじゃなくてgc/gc.h、mallocじゃなくてGC_mallocとしてるだけですね。で、以下のようにコンパイル実行。
% gcc gc.c -lgc -o gc % ./gc count: 100001, heap: 10000100000
なんと10万回のmallocをやり遂げました。なんで? GC_mallocとか使うとヒープ領域が大きくなるの? そんなわきゃないですね。上記コードでpに代入してる、確保した動的領域は明らかにその後使われないですね。なので、GC_mallocさんは賢いので将来使われないことがわかってる子は再利用するわけです。「heap: 10000100000」ってのは確保したのべの領域サイズになります。
(続く)