Lua-garbage-collection

提供:Dev Guides
移動先:案内検索

ルア-ガベージコレクション

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インタープリターによって後の段階で自動的に実行されます。

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