مدیریت حافظه و 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"هر دو

نکات بهینه‌سازی حافظه

معمولاً نیازی به فکر کردن درباره GC نیست — لوا آن را عالی مدیریت می‌کند. فقط در حلقه‌های بازی که هر فریم اجرا می‌شوند، از ساخت جدول بی‌مورد پرهیز کنید.

این مبحث بخشی از دوره آموزش کامل لوا است.

ابزارهای مرتبط