A Lua programozási nyelv

Szabványos könyvtárak

A Lua automatikus memóriakezeléssel rendelkezik. Ez azt jelenti, hogy nem kell foglalkozni a hely lefoglalásával a memóriában, ha egy új objektumot hozunk létre, és a hely felszabadításával sem, ha már nincs szükség az objektumra. A Lua időről időre futtatja a garbage collectort, ami összegyűjti a halott objektumokat (azokat, melyek nem érhetők el tovább). Minden Lua objektum alá van rendelve ennek az automatikus kezelésnek.

A nyelv implementál egy úgynevezett mark-and-sweep collectort. Ez két számot használ arra, hogy irányítsa a szemétgyűjtés folyamatát. Az egyik a szünet szám, a másik pedig a lépés szorzó.

A szünet szám azt mutatja, hogy mennyi időt várjon a garbage collector, mielőtt egy új ciklusba kezdene. A nagyobb számok kevésbé agresszívvá teszik a collectort. Az egynél kisebb szám azt jelenti, hogy a collector nem vár.

A lépés szorzóval lehet befolyásolni a collector sebességét a memória foglaláshoz viszonyítva. A nagy számok esetén agresszívabb a szemétgyűjtés. Az egynél kisebb számok azt eredményezhetik, hogy a ciklus sohasem fejeződik be. Az alapértelmezett érték a 2, ami azt jelenti, hogy a collector kétszer olyan gyorsan fut, mint a helyfoglalás sebessége.

Ezek a számok megváltoztathatóak. C-ben a lua_gc függvény meghívásával, Luaban pedig a collectgarbage függvény meghívásával. Mindkettő egy százalék számot kap paraméterül, tehát a 100 paraméter jelenti az 1-et. Ezekkel a fügvényekkel közvetlenül is lehet irányítani a collectort (például meg lehet állítani és újra lehet indítani).

Az 5.2-es Lua verzió óta létezik ún. emergency garbage collection, azaz vészhelyzeti szemétgyűjtés. Ez azt jelenti, hogy sikertelen memóriafoglalás esetén elindul a szemétgyűjtő, felszabadít mindent, amit lehet, majd ismét megpróbálja a rendszer a kért memóriát lefoglalni. Vészhelyzeti szemétgyűjtés esetén a finalizerek hívására csak később kerül sor.

Szemétgyűjtő metaeljárások

A C API használatával be lehet állítani szemétgyűjtő metaeljárásokat, ezeket szokás még finalizernek is hívni. A finalizerekkel lehetőség van a külső erőforrások kezelésére is. (Például fájlok bezárására, hálózati és adatbázis kapcsolatok vagy saját memória felszabadítására.)

A userdata típus esetén az összegyűjtést befolyásolhatjuk a metatáblájának __gc mezője segítségével. A gyűjtés nem megy végbe azonnal, a Lua beteszi őket egy listába. Miután lezajlott a szemétgyűjtés, egy ezzel a kóddal megyegyező függvény fut le:



function gc_event (udata) local h = metatable(udata).__gc if h then h(udata) end end

Gyenge táblák (Weak Tables)

Gyenge táblák azok a táblák, melyek elemei gyenge referenciák. A gyenge referenciákat a garbage collector figyelmen kívül hagyja. Magyarul, ha egy objektumra csak gyenge referencia hivatkozik, akkor azt a garbage collector begyűjti.

A gyenge tábláknak lehetnek gyenge kulcsai és gyenge értékei, vagy mindkettő. A gyenge kulcsokokkal rendelkező tábla kulcsait össze lehet gyűjteni, de az értékeit nem, kivéve, ha azok is gyengék. Egy tábla gyengesége a metatáblájának __mode mezőjével állíthatő. Ha a __mode mező egy string, ami tartalmazza a 'k' karaktert, akkor a tábla kulcsai gyengék lesznek, ha a 'v' karaktert, akkor az értékei lesznek azok.