Lua-ガベージコレクション

Luaは、Luaに組み込まれている特定のアルゴリズムに基づくガベージコレクションを使用する自動メモリ管理を使用します。自動メモリ管理の結果として、開発者として-

  • オブジェクトにメモリを割り当てることを心配する必要はありません。
  • nilに設定する以外は、不要になったときに解放する必要はありません。

Luaは、Luaプログラムからアクセスできなくなったときに、時々実行されるガベージコレクターを使用して死んだオブジェクトを収集します。

テーブル、ユーザーデータ、関数、スレッド、文字列などを含むすべてのオブジェクトは、自動メモリ管理の対象となります。Luaは、2つの数値を使用してガベージコレクションサイクルを制御するインクリメンタルマークアンドスイープコレクターを使用します。garbage collector pause そして garbage collector step multiplier。これらの値はパーセンテージで表され、100の値は内部的に1に等しいことがよくあります。

ガベージコレクターの一時停止

ガベージコレクタの一時停止は、ガベージコレクタが待機する必要がある時間を制御するために使用されます。Luaの自動メモリ管理によって再び呼び出されます。100未満の値は、Luaが次のサイクルを待機しないことを意味します。同様に、この値の値が高いと、ガベージコレクターの速度が遅くなり、攻撃性が低下します。値200は、コレクターが使用中の合計メモリーが2倍になるのを待ってから、新しいサイクルを開始することを意味します。したがって、アプリケーションの性質と速度によっては、Luaアプリケーションで最高のパフォーマンスを得るには、この値を変更する必要がある場合があります。

ガベージコレクターステップ乗数

このステップ乗数は、Luaプログラムのメモリ割り当ての速度に対するガベージコレクタの相対速度を制御します。ステップ値を大きくすると、ガベージコレクターがより積極的になり、ガベージコレクションの各増分ステップのステップサイズも大きくなります。100未満の値は、ガベージコレクターがそのサイクルを完了しないことを回避することにつながる可能性があり、一般的には好ましくありません。デフォルト値は200です。これは、ガベージコレクタがメモリ割り当ての速度の2倍実行されることを意味します。

ガベージコレクター機能

開発者として、Luaの自動メモリ管理をある程度制御できます。このために、以下の方法があります。

  • collectgarbage("collect") −ガベージコレクションの完全な1サイクルを実行します。

  • collectgarbage("count") −プログラムが現在使用しているメモリの量をキロバイト単位で返します。

  • collectgarbage("restart") −ガベージコレクタが停止している場合は、再起動します。

  • collectgarbage("setpause")− 2番目のパラメーターを100で割った値を、ガベージコレクターの一時停止変数に設定します。その使用法は、少し上で説明したとおりです。

  • collectgarbage("setstepmul")−2番目のパラメーターを100で割った値をガベージステップ乗数変数に設定します。その使用法は、少し上で説明したとおりです。

  • collectgarbage("step")−ガベージコレクションの1つのステップを実行します。2番目の引数が大きいほど、このステップは大きくなります。トリガーされたステップがガベージコレクションサイクルの最後のステップであった場合、collectgarbageはtrueを返します。

  • collectgarbage("stop") −ガベージコレクターが実行されている場合は停止します。

ガベージコレクタの例を使用した簡単な例を以下に示します。

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

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

上記のプログラムを実行すると、次の出力が得られます。この結果は、オペレーティングシステムの種類の違いや、Luaの自動メモリ管理機能によって異なることに注意してください。

23.1455078125   149
23.2880859375   295
0
22.37109375     380

上記のプログラムでわかるように、ガベージコレクションが実行されると、使用されるメモリが削減されます。ただし、これを呼び出すことは必須ではありません。それらを呼び出さなくても、事前定義された期間の後、Luaインタープリターによって後の段階で自動的に実行されます。

もちろん、必要に応じてこれらの関数を使用してガベージコレクターの動作を変更できます。これらの関数は、開発者が複雑な状況を処理するための追加機能を少し提供します。プログラムに必要なメモリの種類に応じて、この機能を使用する場合と使用しない場合があります。ただし、アプリケーションのメモリ使用量を把握し、プログラミング中にそれをチェックして、展開後の望ましくない結果を回避することは非常に役立ちます。