مدیریت حافظه و Garbage Collection در لوا
جمعآوری خودکار حافظه، collectgarbage و weak table ها
مدیریت حافظه در لوا
خبر خوب: لوا حافظه را خودکار مدیریت میکند! Garbage Collector (GC) همهچیز را تمیز میکند.
GC چطور کار میکند؟
هر وقت متغیری دیگر در دسترس نباشد (هیچکس به آن ارجاع ندهد)، GC میتواند حافظهاش را آزاد کند:
local t = {1, 2, 3} -- جدول ساخته شد
t = nil -- دیگر ارجاعی نیست → GC آزادش میکند
collectgarbage — کنترل دستی
-- میزان حافظه در حال استفاده (کیلوبایت)
print(collectgarbage("count"))
-- اجرای دستی یک دور کامل GC
collectgarbage("collect")
-- توقف/ادامه GC
collectgarbage("stop")
collectgarbage("restart")
مثال: مشاهده اثر GC
print("قبل:", collectgarbage("count"))
-- ساخت جدولهای زیاد
local temp = {}
for i = 1, 10000 do
temp = {i, i * 2, tostring(i)}
end
temp = nil
collectgarbage("collect")
print("بعد از GC:", collectgarbage("count"))
Weak Tables — جدولهای ضعیف
گاهی میخواهید جدولی داشته باشید که ارجاعش جلوی GC را نگیرد — مثلاً cache:
-- جدول با مقادیر ضعیف
local cache = setmetatable({}, {__mode = "v"})
local key = "user1"
cache[key] = {"داده", "بزرگ"}
-- اگر هیچکس به این جدول ارجاع ندهد، GC آن را از cache هم حذف میکند!
حالتهای __mode
| مقدار | معنی |
|---|---|
"k" | کلیدها ضعیف |
"v" | مقادیر ضعیف |
"kv" | هر دو |
نکات بهینهسازی حافظه
- local بهجای global: متغیرهای محلی سریعترند و زودتر آزاد میشوند
- nil کردن متغیرهای بزرگ: به GC کمک میکند
- استفاده مجدد از جدولها: بهجای ساخت مکرر، همان را پاک و پر کنید
- رشتهها share میشوند: رشتههای یکسان یکبار ذخیره میشوند!
معمولاً نیازی به فکر کردن درباره GC نیست — لوا آن را عالی مدیریت میکند. فقط در حلقههای بازی که هر فریم اجرا میشوند، از ساخت جدول بیمورد پرهیز کنید.
این مبحث بخشی از دوره آموزش کامل لوا است.