Lua ガベージコレクション

Lua は自動メモリ管理を採用しています。つまり、新しく作成したオブジェクトが必要とするメモリの割り当て方法を気にしたり、オブジェクトが使われなくなった後にそのメモリをどのように解放するかを考える必要はありません。

Lua はガベージコレクタを実行して、すべてのデッドオブジェクト(死んだオブジェクト)(すなわち Lua 内で二度とアクセスできないオブジェクト)を収集することで自動メモリ管理を行います。Lua で使用されるすべてのメモリ(文字列、テーブル、ユーザーデータ、関数、スレッド、内部構造など)は自動管理の対象です。

Lua はインクリメンタルなマーク・スイープコレクタを実装しています。ガベージコレクタのサイクルを制御するために、次の2つの数値を使用します。ガベージコレクタの休止率とガベージコレクタのステップ倍率です。これらの数値はどちらもパーセント単位で表されます(例: 値100は内部的に1を意味します)。

ガベージコレクタの休止率は、コレクタが新しいサイクルを開始する前にどれだけ待機する必要があるかを制御します。この値を増やすと、コレクタの積極性が低下します。この値が100より小さい場合、コレクタは新しいサイクルを開始する前に待機しません。この値を200に設定すると、コレクタは総メモリ使用量が以前の2倍になるまで新しいサイクルを開始しません。

ガベージコレクタのステップ倍率は、メモリ割り当て速度に対するコレクタの動作速度の倍率を制御します。この値を増やすと、コレクタがより積極的になるだけでなく、各インクリメンタルステップの長さも増加します。この値を100未満に設定しないでください。そうすると、コレクタの動作が遅すぎてサイクルを完了できなくなります。デフォルト値は200で、コレクタがメモリ割り当ての「2倍」の速度で動作することを意味します。

ステップ倍率を非常に大きな数値(プログラムが使用する可能性のあるバイト数より10%大きい値)に設定すると、コレクタはストップ・ザ・ワールドコレクタのように動作します。さらに休止率を200に設定すると、コレクタの動作は以前のLuaバージョンと同じになります。Luaが使用するメモリが2倍になるたびに、完全なコレクションが実行されます。


ガベージコレクタ関数

Lua は以下の関数を提供していますcollectgarbage ([opt [, arg]])自動メモリ管理を制御するために使用します:

  • collectgarbage("collect"): 完全なガベージコレクションサイクルを実行します。引数 opt によって、さまざまな機能が提供されます。

  • collectgarbage("count"): Lua が使用している総メモリ量を K バイト単位で返します。この値には小数部分があるため、1024を掛けるだけで Lua が使用している正確なバイト数が得られます(オーバーフローしない限り)。

  • collectgarbage("restart"): ガベージコレクタの自動実行を再開します。

  • collectgarbage("setpause"): ガベージコレクタの休止率を arg に設定します。休止率の前の値を返します。

  • collectgarbage("setstepmul"): ステップ倍率の前の値を返します。

  • collectgarbage("step"): ガベージコレクタを単一ステップ実行します。ステップの「大きさ」は arg によって制御されます。0を渡すと、コレクタは(分割不能な)1ステップ進みます。0以外の値を渡すと、コレクタは Lua がこれら(Kバイト)のメモリを割り当てるのと同等の作業を行います。コレクタがサイクルを終了した場合は true を返します。

  • collectgarbage("stop"): ガベージコレクタの実行を停止します。再開が呼び出されるまで、コレクタは明示的な呼び出しによってのみ実行されます。

以下は簡単なガベージコレクションの例を示しています:

例

mytable = {"apple", "orange", "banana"}

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

上記のプログラムを実行すると、出力結果は次のとおりです(メモリ使用量の変化に注意してください):

20.9560546875
20.9853515625
0
19.4111328125
その他の拡張