
今回はXBee3のMicroPythonに内蔵されているモジュールのひとつであるガベージコレクション(Garbage Collection, GC)について解説します。ガベージコレクションは前々回のFFTの実装の際に使用しましたが、詳しい説明を省略していました。
ガベージコレクションとはプログラムの実行中に発生する使用されないメモリ領域である「ごみ(Garbage)」を自動的に「回収(Collection)」して再利用する仕組みを意味します。MicroPythonは起動時にひとつの大きな固定サイズのメモリ領域(ヒープ)を確保します。このヒープはPythonオブジェクトのための専用エリアです。MicroPythonのガベージコレクション(GC)はこのヒープだけを対象に管理します。CやC++のようにプログラマ自身がfree()やdeleteで明示的に解放する必要がある言語と違い、Python, Java, C# などの多くの高級言語ではGC がメモリ管理を肩代わりしてくれます。
MicroPythonに内蔵されているモジュールの情報を詳しく確認するには、MicroPython Terminal上で以下の方法を使うと便利です。
>>> help(‘modules’):利用可能なモジュール一覧を表示する。全てのモジュールが表示されるわけでは無い。
>>> help(‘モジュール名’):組込関数名等のモジュールの内容を表示する。
>>> dir(モジュール):実行環境での属性一覧を表示する。
>>> type():オブジェクトの型表示する。これにより、関数の戻り値などを調査可能。
以下の図はMicroPython Terminalでhelp(‘modules’)を実行した結果です。gcが内蔵されているモジュールであることを確認することができます。

以下の図はhelp(‘gc’)を実行した結果です。組込関数名等のモジュールの内容が表示されています。

以下の図はdir(gc)を実行した結果です。実行環境での属性一覧を表示されています。

以下の図はtype(gc.collect)等を実行した結果です。オブジェクトの型が表示されていることが分かります。

ガベージコレクションは言語や実装の形態に様々な方式がありますが、以下に代表的なものを紹介します。
方式 | 概要 |
参照カウント方式 | ブジェクトの「参照されている数」を数え、0になったら即解放する方式です。単純・リアルタイム性は高いが循環参照を回収できない。 |
マークアンドスイープ | 全てのオブジェクトを一旦「未使用」とマークする。その後、生きているオブジェクトをマークし直す。そして、残った未使用オブジェクトを解放する方式です。 |
世代別GC | ブジェクトを「世代」に分け、長生きしているオブジェクトは頻繁にチェックせず、若いオブジェクトだけ頻繁に回収することで効率化を図る方式です。 |
コピーGC / コンパクション | メモリを2領域に分け、生きているオブジェクトを一方にコピーしてメモリの断片化を防ぐ 方式です。 |
【MicroPython の場合】
メモリが少ない組み込み機器向けに適している軽量な「マークアンドスイープ型」のGCを採用しています。MicroPythonでは単純で早い参照カウント方式が部分的に使用される場合があります。世代別GCは実装が複雑で小規模環境に不向きであるため、原則としてMicroPythonでは使用されません。また、コピーGC / コンパクション はメモリ2倍使用するため、XBeeの環境下では不向きであり使用されません。