Shaughnessyが、ブタペストで開催されたRUPY2013でのプレゼンの前半を自らのブログで紹介しています。ガベージコレクタは、「ゴミを集める」という行為だけでなく、「新しいオブジェクトのためにメモリをあてがう。」「不要なオブジェクトを見つける」「不要なオブジェクトからメモリを取り戻す。」という、人間の心臓が血液を浄化するような働きをしている。この簡単なコードサンプルを見ると、RubyとPythonの記述はよく似ているが、それぞれの言語の内部でのインプリの仕組みは違う。コードで利用されるアクティブなオブジェクトになる。[図](もちろん実際には他の役割を担うオブジェクトもあって、もっと複雑だが、話しをシンプルにするためにこの図の考え方を使って説明している。listから渡してくれる。McCarthyがLispの開発の過程でつくったアルゴリズムを用いている。listの仕組みを内部ではもっているが、通常はRubyとは違うメモリの扱いをする。PythonはオブジェクトをつくったらすぐにOSにメモリを要求する。[図](Pythonは実際、OSヒープ上に追加の抽象化レイヤをつくるメモリ適用システムをインプリするが、今回はその詳細の説明は割愛。)二つ目のオブジェクトをつくる場合も同様に、OSにメモリを要求する。listの残りが少なくなる。n1に新しいバリューがアサインされると、古いバリューが残ったオブジェクトが放置されていることに注目してほしい。Pythonは未利用のオブジェクトを掃除PythonではオブジェクトのC構造の内部に参照カウントという整数をもち、初期数値は1。1という数字は一つのポインターが指す、参照されているという意味。新しいnodeがつくられて、元のnodeが不要になると、そこの参照カウントがゼロになる。PythonはそのメモリをOSに戻す。参照カウンターは、同じ1960年にGeorgeCollinsが生み出したアルゴリズム。次に、n2がn1と同じnodeを参照すると、従前にn2が参照していたnodeは掃除される。なるとRubyはアプリを止め、全体をループし、メモリがあてられているオブジェクトにマークをつける。bitmapで管理している。copy-on-writeの最適化を利用するためbitmapを別のメモリ場所に保管している。マークされていないオブジェクトは掃除される。listを作成することで、オブジェクトをリストに返しているので、作業はかなり短い時間で完了する。各オブジェクトの内部に参照カウントを置くスペースを確保したり、変数/参照を上下変化させるオペーレーションなど、この手法のインプリは難易度が高い。Pythonは頻度高く参照カウントを更新していて、例えば大きなデータ構造の利用をやめると、参照カウントの修正が一気に、かつかなり複雑な作業になり、アプリが遅くなる可能性がある。参照カウントは、巡回する循環参照のデータ構造には使えない。(次回詳細説明)その2はこちら。#ガベージコレクタBack。