تجنّب تسرّبات الذاكرة
تعرّف إلى أنماط التسرّب الشائعة في Lua واستراتيجيات منعها
تجنّب تسرّبات الذاكرة درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
ما تسرّب الذاكرة في Lua؟
يحدث تسرّب الذاكرة عندما تتراكم الكائنات في الذاكرة لأن مرجعًا ما يمنع GC من جمعها، رغم أن البرنامج لم يعد يحتاج إليها.
تسرّب شائع: التراكم العام
يُعد تخزين الكائنات في جدول عام دون إزالتها تسرّبًا كلاسيكيًا. فالجدول العام دائمًا جذر GC.
local cache = {} -- global-like upvalue
function storeResult(key, val)
cache[key] = val -- never evicted!
endالإصلاح: ذاكرة تخزين مؤقتة محدودة
حدّدوا حجم ذاكرة التخزين المؤقت، وأزيلوا الإدخالات القديمة باستخدام استراتيجية LRU أو حدّ بسيط للحجم.
local MAX = 100
local function boundedStore(cache, key, val)
if #cache >= MAX then
table.remove(cache, 1) -- evict oldest
end
cache[key] = val
endتسرّب شائع: مستمعو الأحداث
يؤدي تسجيل closure كمستمع لحدث وعدم إلغاء تسجيله مطلقًا إلى إبقاء كل من closure وupvalues الخاصة به حيّين.
local listeners = {}
function on(event, fn)
listeners[event] = listeners[event] or {}
listeners[event][#listeners[event]+1] = fn
end
-- Always provide off() to deregister!الإصلاح: جداول مستمعين ضعيفة
خزّنوا المستمعين في جدول ذي قيم ضعيفة، بحيث تتم إزالة مستمع الكائن تلقائيًا إذا جُمِع الكائن المشترك.
local listeners = setmetatable({}, {__mode = "v"})تسرّب شائع: closures تلتقط جداول كبيرة
تحافظ closure التي تلتقط جدولًا كبيرًا عليه حيًّا طوال فترة بقاء closure، حتى إذا كانت هناك حاجة إلى جزء صغير فقط من الجدول.
local bigData = {-- 100MB of data --}
local fn = function()
return bigData[1] -- bigData stays alive!
endالإصلاح: استخراج القيم المطلوبة
استخرجوا القيم المطلوبة فقط قبل إنشاء closure، لكي يمكن جمع الجدول الكبير.
local needed = bigData[1]
bigData = nil -- allow collection
local fn = function() return needed endتسرّبات coroutines
تبقى coroutine المعلّقة حيّة وتحتفظ بجميع متغيراتها المحلية. أما coroutines الميتة (بحالة "dead") فيمكن جمعها. لا تفقدوا تتبّع coroutines المعلّقة مطلقًا.
تراكم السلاسل النصية
يؤدي دمج السلاسل النصية داخل حلقة باستخدام .. إلى إنشاء العديد من السلاسل الوسيطة. استخدموا table.concat لإنشاء السلاسل الكبيرة بكفاءة.
local parts = {}
for i = 1, 1000 do parts[i] = tostring(i) end
local result = table.concat(parts, ",")تصحيح تسرّبات الذاكرة
استخدموا collectgarbage("count") قبل العمليات وبعدها لقياس نمو الذاكرة. وسجّلوا حالات النمو المريبة لتضييق نطاق مصدر التسرّب.
local before = collectgarbage("count")
-- ... run operation ...
collectgarbage()
local after = collectgarbage("count")
print(("Delta: %.1f KB"):format(after - before))أدوات تحليل الأداء
يمكن لأدوات مثل luamemprof وعدادات التخصيص المخصّصة باستخدام debug.sethook تتبّع مسارات التعليمات البرمجية التي تخصص أكبر قدر من الذاكرة.
سؤال حول تسرّب الذاكرة
أي نمط يُرجّح أن يسبب تسرّبًا للذاكرة؟
مراجعة: تجنّب تسرّبات الذاكرة
تنشأ تسرّبات Lua من ذاكرات التخزين المؤقتة غير المحدودة، والمستمعين الذين لم يُلغَ تسجيلهم، وclosures التي تشير إلى جداول كبيرة، وcoroutines المعلّقة المنسية. استخدموا الجداول الضعيفة وذاكرات التخزين المؤقتة المحدودة وcollectgarbage("count") لاكتشاف التسرّبات ومنعها.
الأسئلة الشائعة
هل درس «تجنّب تسرّبات الذاكرة» مجاني؟
نعم — نص درس «تجنّب تسرّبات الذاكرة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «تجنّب تسرّبات الذاكرة»؟
تعرّف إلى أنماط التسرّب الشائعة في Lua واستراتيجيات منعها تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تجنّب تسرّبات الذاكرة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات جامع البيانات المهملة في Lua
- المفاتيح والقيم الضعيفة
- المنهيات باستخدام __gc
- تجنّب تسرّبات الذاكرة