Lua - Çöp Toplama

Lua, Lua'da yerleşik olan belirli algoritmalara göre çöp toplamayı kullanan otomatik bellek yönetimi kullanır. Otomatik bellek yönetiminin bir sonucu olarak, bir geliştirici olarak -

  • Nesneler için bellek ayırma konusunda endişelenmenize gerek yok.
  • Sıfıra ayarlamak dışında artık gerekmediğinde onları serbest bırakmanıza gerek yok.

Lua, Lua programından artık erişilemeyen ölü nesneleri toplamak için zaman zaman çalışan bir çöp toplayıcı kullanır.

Tablolar, kullanıcı verileri, işlevler, iş parçacığı, dizge vb. Dahil tüm nesneler otomatik bellek yönetimine tabidir. Lua, çöp toplama döngülerini kontrol etmek için iki sayı kullanan artımlı işaret ve süpürme toplayıcı kullanır.garbage collector pause ve garbage collector step multiplier. Bu değerler yüzde cinsindendir ve 100 değeri genellikle dahili olarak 1'e eşittir.

Çöp Toplayıcı Duraklat

Çöp toplayıcı duraklaması, daha önce çöp toplayıcının ne kadar beklemesi gerektiğini kontrol etmek için kullanılır; Lua'nın otomatik bellek yönetimi tarafından yeniden çağrılır. 100'den küçük değerler, Lua'nın bir sonraki döngüyü beklemeyeceği anlamına gelir. Benzer şekilde, bu değerin daha yüksek değerleri, çöp toplayıcının doğası gereği daha yavaş ve daha az agresif olmasına neden olur. 200 değeri, toplayıcının yeni bir döngüye başlamadan önce kullanımdaki toplam belleğin iki katına çıkmasını beklediği anlamına gelir. Bu nedenle, uygulamanın niteliğine ve hızına bağlı olarak, Lua uygulamalarında en iyi performansı elde etmek için bu değeri değiştirme gereksinimi olabilir.

Çöp Toplayıcı Adım Çarpanı

Bu adım çarpanı, atık toplayıcının Lua programındaki bellek ayırma hızına göreceli hızını kontrol eder. Daha büyük adım değerleri, çöp toplayıcının daha agresif olmasına yol açacak ve ayrıca atık toplamanın her bir artan adımının adım boyutunu artıracaktır. 100'den küçük değerler çoğu kez çöp toplayıcının döngüsünü tamamlamamasına neden olabilir ve bu genellikle tercih edilmez. Varsayılan değer 200'dür, bu da çöp toplayıcının bellek ayırma hızının iki katı çalıştığı anlamına gelir.

Çöp Toplayıcı İşlevleri

Geliştiriciler olarak, Lua'daki otomatik bellek yönetimi üzerinde biraz kontrolümüz var. Bunun için aşağıdaki yöntemlere sahibiz.

  • collectgarbage("collect") - Tam bir çöp toplama döngüsü çalıştırır.

  • collectgarbage("count") - Program tarafından şu anda kullanılan bellek miktarını Kilobayt cinsinden döndürür.

  • collectgarbage("restart") - Çöp toplayıcı durdurulmuşsa, yeniden başlatır.

  • collectgarbage("setpause")- Çöp toplayıcı duraklama değişkenine 100'e bölünen ikinci parametre olarak verilen değeri ayarlar. Kullanımları yukarıda biraz tartışıldığı gibidir.

  • collectgarbage("setstepmul")- İkinci parametre olarak verilen değeri 100'e bölerek çöp adımı çarpanı değişkenine ayarlar. Kullanımları yukarıda biraz tartışıldığı gibidir.

  • collectgarbage("step")- Çöp toplamanın bir adımını çalıştırır. İkinci argüman ne kadar büyükse, bu adım o kadar büyük olacaktır. Collectgarbage, tetiklenen adım bir çöp toplama döngüsünün son adımı ise true değerini döndürür.

  • collectgarbage("stop") - Çalışıyorsa çöp toplayıcıyı durdurur.

Çöp toplayıcı örneğini kullanan basit bir örnek aşağıda gösterilmiştir.

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

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

Yukarıdaki programı çalıştırdığımızda aşağıdaki çıktıyı alacağız. Lütfen bu sonucun işletim sistemi tipindeki farklılıktan ve ayrıca Lua'nın otomatik bellek yönetimi özelliğinden dolayı değişeceğini unutmayın.

23.1455078125   149
23.2880859375   295
0
22.37109375     380

Yukarıdaki programda görebileceğiniz gibi, çöp toplama yapıldığında kullanılan hafıza azaldı. Ancak bunu adlandırmak zorunlu değildir. Onları aramasak bile, önceden tanımlanmış sürenin ardından Lua tercümanı tarafından daha sonraki bir aşamada otomatik olarak yürütülecektir.

Açıkçası, gerekirse bu işlevleri kullanarak çöp toplayıcının davranışını değiştirebiliriz. Bu işlevler, geliştiricinin karmaşık durumları ele alması için biraz ek yetenek sağlar. Program için gereken bellek türüne bağlı olarak, bu özelliği kullanabilir veya kullanmayabilirsiniz. Ancak uygulamalardaki bellek kullanımını bilmek ve dağıtımdan sonra istenmeyen sonuçları önlemek için programlama sırasında kontrol etmek çok yararlıdır.