その図書室は不思議な図書室です。
利用したい人はそこに本棚を作り、いろんな本を自由に置いて使うことができます。大きな分厚い本、小さな薄い本、それも自由。ただし、必ず司書さんを通して本を置いたり退けたりしなければならない、というルールが存在します。つまり、本棚を作った後は、利用者が直接触ることはできないってことです。図書室はとても固いセキュリティに護られているんですよ。
さて、そんな本棚には4つの棚があり、本の配置には厳格な決まりがあります。
本の大きさや分厚さがある一定サイズを超えていた場合、必ず一番下の棚に本を置き、それ以外は必ず上から置く、というルールです。
それでは実際に、一つ本棚を作って、司書さんに、分厚い図鑑を置く事からお願いしてみましょう。
司書さんは一番下の棚にその図鑑をおきます。大きい本ですからね。
今度は、小さな本をお願いしました。
司書さんはその本を一番上の棚に置きます。小さいですもん。
まぁそんなこんなで、何冊か色んな本を司書さんにお願いした後、使用者にはもう読まない本がでてきているでしょう。早速お願いして退けてもらいます。が、ここはあくまでも、「使わないよ宣言」にすぎません。司書さんは非効率な仕事は好まないので、すぐに本を処分しないのです。とりあえず、「使わない」ラベルを貼って、まだ本棚に置きっぱなしにしておきます。
やがて、一番上の棚がいっぱいになり、頼まれた本が入らなくなりました。司書さんは、ここではじめて「使わないラベル」が貼られた本を棚からどけて、残った一番上の棚の本を二番目の棚に移動させます。こうして、もう一度、上の棚で本を並べて仕事を続けます。
繰り返して、また上の棚がいっぱいになりました。司書さんは二番目の棚で「使わないラベル」の本をどけてさらに一つ下の棚に置き、一番目の棚で「使わないラベル」になった本をどけてその開いた二番目に入れ、一番上の棚を空けます。
さらに、また上の棚がいっぱいになりました。司書さんは三番目の棚の「使わないラベル」の本をどけて間をつめ、二番目の棚の「使わないラベル」の本をそこへ移し、入りきらないものを二番目に残します。そこへ一番上の棚の「使わないラベル」の本をどけた残りの本を移し、さらに上の棚を使えるようにしようとします。
……でも、さらに本が来たら……
司書さんは「これ以上仕事はできません」と返事をし、一切の仕事を拒否します。一度本棚を撤去して、再度本棚を作り直すことから始めましょう。
本棚=プロセスメモリ空間
一番目の棚=GC ジェネレーション0
二番目の棚=GC ジェネレーション1
三番目の棚=GC ジェネレーション2
四番目の棚=ラージ オブジェクト ヒープ
司書さんの仕事=.NetFramework のガベージコレクタ制御
本=プログラムで使用するオブジェクトメモリ
はい、簡単で超大雑把なGCのお話でした(^^;