English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

جمع القمامة (garbage collection) في Lua

Lua يستخدم إدارة ذاكرة التخزين التلقائية. هذا يعني أنك لا تحتاج إلى العناية بتخصيص ذاكرة التخزين للرموز الجديدة أو التفكير في كيفية إطلاقها عند عدم استخدامها بعد الآن.

يشغل Luaجهاز جمع القمامةلجمع كلالرمز الميت لإكمال عمل إدارة ذاكرة التخزين التلقائية. جميع ذاكرة التخزين المستخدمة في Lua، مثل: الأنماط، الجداول، البيانات الشخصية، الدوال، الخيوط، الهياكل الداخلية، وما إلى ذلك، تتبع إدارة تلقائية.

يimplement Lua جهاز جمع القمامة التدرجي. يستخدم هذين الرقمين لتحكم في دورة جمع القمامة: معدل الاستراحة الخاص بجهاز جمع القمامة ومعدل مضاعف خطوات جمع القمامة. كلا الرقمين تستخدم كواحد في المائة (مثلًا: القيمة 100 تعبر عن 1 داخليًا).

معدل الاستراحة الخاص بجهاز جمع القمامة يتحكم في المدة التي يجب أن ينتظر فيها الجهاز قبل بدء دورة جديدة. زيادة هذا القيمة سيزيد من تقليل نشاط الجهاز. عندما يكون هذا القيمة أقل من 100، لن ينتظر الجهاز قبل بدء دورة جديدة. إعداد هذا القيمة على 200 سيجعل الجهاز ينتظر حتى يصل استخدام ذاكرة التخزين إلى مضاعف 2 مما كان من قبل قبل بدء دورة جديدة.

معدل مضاعف خطوات جمع القمامة يتحكم في مضاعف سرعة عمل جهاز جمع القمامة مقارنة بسرعة تخصيص ذاكرة التخزين. زيادة هذا القيمة لن يجعل جهاز جمع القمامة أكثر نشاطًا فقط، بل سيزيد أيضًا من طول كل خطوة إضافية. لا تضع هذا القيمة أقل من 100، حيث سيكون جهاز جمع القمامة يعمل ببطء جدًا حتى لا يتمكن من إكمال دورة واحدة أبدًا. القيمة الافتراضية هي 200، مما يعني أن جهاز جمع القمامة يعمل بسرعة "مضاعفة" سرعة تخصيص ذاكرة التخزين.

إذا قمت بضبط مضاعف الخطوات على عدد كبير جدًا (أكبر من 10% من عدد الأحرف التي قد يستخدمها برنامجك)، فإن سلوك جهاز جمع القمامة يشبه جهاز "وقف العالم". بعد ذلك، إذا قمت بضبط معدل الاستراحة على 200، فإن سلوك جهاز جمع القمامة سيكون مثل إصدارات Lua القديمة: يتم إجراء جمع قمامة كامل كلما زادت ذاكرة Lua المستخدمة بمضاعف 2.

دالة جمع القمامة

يقدم Lua الدوال التالية:collectgarbage ([opt [, arg]])للتحكم في إدارة ذاكرة التخزين التلقائية:

  • collectgarbage("collect"):  إجراء دورة جمع القمامة الكاملة. يقدم opt مجموعة متنوعة من الوظائف المختلفة:}}

  • collectgarbage("count"): العودة إلى إجمالي عدد البايتات المستخدمة من قبل Lua بالكيلو بايت. لهذا القيمة جزء صغير، لذا يجب ضربها في 1024 للحصول على عدد البايتات المستخدمة بدقة (ما لم يحدث إنفصال).

  • collectgarbage("restart"): إعادة تشغيل التشغيل التلقائي لمحول القمامة.

  • collectgarbage("setpause"): تعيين arg إلى معدل الاستراحة لمحول القمامة. العودة إلى القيمة السابقة للمعدل.

  • collectgarbage("setstepmul"): العودة إلى القيمة السابقة للعدد المضاعف للخطوة.

  • collectgarbage("step"): تشغيل محول القمامة خطوة بخطوة. يتحكم المعامل arg في حجم الخطوة. عند إدخال 0، يقدم المحول خطوة واحدة (غير قابلة للإنقسام). عند إدخال قيمة غير صفر، يقدم المحول جمع القمامة يعادل Lua تخصيص هذه الأجزاء من الذاكرة (بكيلو بايت). إذا انتهى المحول من دورة سيقوم بالعودة بالقيمة true.

  • collectgarbage("stop"): توقف تشغيل محول القمامة. قبل التشغيل مرة أخرى، سيكون المحول يعمل فقط عند الطلب المباشر.

فيما يلي عرض لمثال بسيط على جمع القمامة:

mytable = {"apple", "orange", "banana"}
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))

بمجرد تنفيذ البرنامج أعلاه، سيتم عرض النتائج التالية (انتبه لتغير استخدام الذاكرة):

20.9560546875
20.9853515625
0
19.4111328125