Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@yasuoka
Last active September 16, 2022 07:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yasuoka/37d3b4ac58771b4c6dd872d462774f1a to your computer and use it in GitHub Desktop.
Save yasuoka/37d3b4ac58771b4c6dd872d462774f1a to your computer and use it in GitHub Desktop.

https://www.lua.org/manual/5.1/manual.html#2.10

2.10 ガーベージコレクタ

Lua は自動でメモリ管理を行う。これは、新しいオブジェクトのメモリを確保したり、オブジェクトが不要になった時にそのメモリを解放する心配をする必要がないことを意味する。Lua は、逐次「死んだオブジェクト」(Lua からもうアクセスできないオブジェクト) を回収する「ガベージコレクタ」を走らせ、メモリを自動で管理する。テーブル、ユーザデータ、関数、スレッド、文字列、など、Lua が使うすべてのメモリは自動で管理される。

Lua はインクリメンタル mark-and-sweap コレクタを実装する。これはガベージコレクションのサイクルを制御するために、「ガベージコレクタ pause」と「ガベージコレクタ step multiplier」、二つのを用いる。どちらも単位としてパーセンテージを使う (つまり、100 は内部値として 1 を意味する)

ガベージコレクタ pause は新しいサイクルを開始するまでの長さを制御する。大きな値は、コレクタをより消極的にする。100 以下の値は、コレクタは新しいサイクルをスタートするまで待たないことを意味する。200 は、コレクタは新しいサイクルを開始する前より合計メモリが倍になるまで待つことを意味する。

step multiplier はメモリ割り当てに対するコレクタの相対スピードを制御する。大きな値はコレクタをより積極的にし、しかし各インクリメンタルステップの増加サイズもまた拡大する。100 未満の値は、コレクタを遅くしすぎて、サイクルが決して完了しない結果になりえる。デフォルトの 200 は、メモリ割り当てのスピードに "2回" コレクタを走行させることを意味する。

これらの数値は、C で lua_gc 関数を呼び出すか Lua で collectgarbase 関数を呼び出すことで変更できる。これらの関数で (停止、再開など) コレクタを直接操作することもできる。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment