جمع النفايات (علوم الحاسوب)

عملية جمع البيانات المهملة بتقنية الإيقاف والنسخ في بنية لغة ليسب : [ 1 ] تُقسّم الذاكرة إلى ذاكرة عاملة وذاكرة حرة ؛ تُخصص الكائنات الجديدة في الذاكرة العاملة. عندما تمتلئ الذاكرة العاملة (كما هو موضح)، تُجرى عملية جمع البيانات المهملة: حيث تُحدد جميع هياكل البيانات التي لا تزال قيد الاستخدام عن طريق تتبع المؤشرات، ثم تُنسخ إلى مواقع متتالية في الذاكرة الحرة.
بعد ذلك، يتم التخلص من محتويات الذاكرة العاملة لصالح النسخة المضغوطة، ويتم تبادل دور الذاكرة العاملة والذاكرة الحرة (كما هو موضح).

في علم الحاسوب ، تُعدّ عملية جمع البيانات المهملة ( GC ) شكلاً من أشكال إدارة الذاكرة التلقائية . [ 2 ] يحاول جامع البيانات المهملة استعادة الذاكرة التي خصصها البرنامج، ولكن لم يعد يُستخدم؛ وتُسمى هذه الذاكرة بالبيانات المهملة . ابتكر عالم الحاسوب الأمريكي جون مكارثي عملية جمع البيانات المهملة حوالي عام 1959 لتبسيط إدارة الذاكرة اليدوية في لغة ليسب . [ 3 ]

تُعفي عملية جمع البيانات المهملة المبرمج من إدارة الذاكرة يدويًا ، حيث يُحدد المبرمج الكائنات التي يجب تحريرها وإعادتها إلى نظام الذاكرة، ومتى يتم ذلك. [ 2 ] تشمل التقنيات الأخرى المشابهة تخصيص الذاكرة في المكدس ، واستنتاج المناطق ، وملكية الذاكرة، بالإضافة إلى تركيبات منها. قد تستغرق عملية جمع البيانات المهملة نسبة كبيرة من إجمالي وقت معالجة البرنامج، مما يؤثر على الأداء .

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

ملخص

تتطلب العديد من لغات البرمجة جمع البيانات المهملة، إما كجزء من مواصفات اللغة (مثل RPL ، وجافا ، وسي شارب، ودي، وجو ، ومعظم لغات البرمجة النصية ) أو بشكل فعال للتطبيق العملي (مثل اللغات الرسمية كحساب لامدا ). [ 5 ] تُعرف هذه اللغات بلغات جمع البيانات المهملة . صُممت لغات أخرى، مثل سي وسي ++ ، للاستخدام مع إدارة الذاكرة اليدوية، ولكنها تتضمن تطبيقات لجمع البيانات المهملة. تسمح بعض اللغات، مثل آدا ، وموديولا -3 ، وسي ++/CLI ، بتعايش جمع البيانات المهملة وإدارة الذاكرة اليدوية في نفس التطبيق باستخدام أكوام منفصلة للكائنات التي تم جمعها وتلك التي تمت إدارتها يدويًا. بينما لغات أخرى، مثل دي ، تجمع البيانات المهملة ولكنها تسمح للمستخدم بحذف الكائنات يدويًا أو حتى تعطيل جمع البيانات المهملة تمامًا عند الحاجة إلى السرعة. [ 6 ]

على الرغم من أن العديد من لغات البرمجة تدمج نظام جمع البيانات المهملة (GC) في نظام الترجمة ووقت التشغيل الخاص بها ، إلا أن هناك أنظمة لجمع البيانات المهملة لاحقة ، مثل نظام العد المرجعي التلقائي (ARC). بعض هذه الأنظمة لا تتطلب إعادة ترجمة. [ 7 ]

المزايا

يُعفي جامع البيانات المهملة المبرمج من تحرير الذاكرة يدويًا. وهذا يساعد على تجنب بعض أنواع الأخطاء : [ 8 ]

  • تحدث مشكلة المؤشرات المعلقة عندما يتم تحرير جزء من الذاكرة بينما لا تزال هناك مؤشرات تشير إليه، ويتم إلغاء مرجعية أحد هذه المؤشرات . بحلول ذلك الوقت، قد تكون الذاكرة قد أعيد تخصيصها لاستخدام آخر، مما يؤدي إلى نتائج غير متوقعة. [ 9 ]
  • أخطاء التحرير المزدوج ، والتي تحدث عندما يحاول البرنامج تحرير منطقة من الذاكرة تم تحريرها بالفعل، وربما تم تخصيصها مرة أخرى.
  • قد تؤدي بعض أنواع تسرب الذاكرة ، التي يفشل فيها البرنامج في تحرير الذاكرة التي تشغلها كائنات أصبحت غير قابلة للوصول ، إلى استنفاد الذاكرة. [ 10 ]

العيوب

تستخدم عملية جمع البيانات المهملة (GC) موارد الحوسبة لتحديد الذاكرة التي يجب تحريرها. ولذلك، فإن ثمن سهولة عدم تحديد دورة حياة الكائنات يدويًا في شفرة المصدر هو زيادة في الحمل ، مما قد يؤثر سلبًا على أداء البرنامج. [ 11 ] خلصت ورقة بحثية محكمة نُشرت عام 2005 إلى أن عملية جمع البيانات المهملة تحتاج إلى خمسة أضعاف الذاكرة للتعويض عن هذا الحمل وللعمل بنفس سرعة البرنامج نفسه باستخدام إدارة ذاكرة صريحة مثالية. ومع ذلك، تتم المقارنة مع برنامج تم إنشاؤه عن طريق إدخال استدعاءات إلغاء تخصيص الذاكرة باستخدام وسيط ، ويتم تنفيذه من خلال جمع آثار من برامج تعمل تحت مُحلل أداء ، ويكون البرنامج صحيحًا فقط لتنفيذ واحد محدد. [ 12 ] يمكن أن يؤدي التفاعل مع تأثيرات التسلسل الهرمي للذاكرة إلى جعل هذا الحمل غير مقبول في ظروف يصعب التنبؤ بها أو اكتشافها في الاختبارات الروتينية. وقد ذكرت شركة آبل تأثير ذلك على الأداء كسبب لعدم اعتمادها لجمع البيانات المهملة في نظام iOS ، على الرغم من كونه الميزة الأكثر طلبًا. [ 13 ]

قد يكون وقت جمع البيانات المهملة غير متوقع، مما يؤدي إلى توقفات متفرقة (توقفات مؤقتة لتحرير الذاكرة) خلال الجلسة . قد تكون هذه التوقفات غير المتوقعة غير مقبولة في بيئات الوقت الحقيقي ، أو في معالجة المعاملات ، أو في البرامج التفاعلية. تعالج أدوات جمع البيانات المهملة التزايدية والمتزامنة واللحظية هذه المشاكل، مع وجود تنازلات متفاوتة.

الاستراتيجيات

التتبع

يُعدّ تتبع عملية جمع البيانات المهملة النوع الأكثر شيوعًا، لدرجة أن مصطلح "جمع البيانات المهملة" غالبًا ما يُشير إلى تتبع هذه العملية، بدلًا من طرق أخرى مثل عدّ المراجع . وتتلخص الاستراتيجية العامة في تحديد الكائنات التي يجب جمعها من خلال تتبع الكائنات التي يُمكن الوصول إليها عبر سلسلة من المراجع من كائنات جذرية معينة، واعتبار الباقي بيانات مهملة وجمعها. [ 14 ] ومع ذلك، يوجد عدد كبير من الخوارزميات المستخدمة في التنفيذ، وتختلف هذه الخوارزميات اختلافًا كبيرًا في التعقيد وخصائص الأداء.

عدّ المراجع

تعتمد عملية جمع البيانات المهملة باستخدام عدّ المراجع على عدّ كل كائن، حيث يُحسب عدد المراجع التي تشير إليه. وتُعرف البيانات المهملة بأنها تلك التي يكون عدد مراجعها صفرًا. يُزاد عدد مراجع الكائن عند إنشاء مرجع إليه، ويُنقص عند حذفه. وعندما يصل العدد إلى الصفر، تُستعاد ذاكرة الكائن. [ 15 ]

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

هناك عدد من عيوب عدّ المراجع؛ ويمكن عموماً حل هذه المشكلة أو التخفيف من حدتها باستخدام خوارزميات أكثر تطوراً:

دورات
إذا أشار كائنان أو أكثر إلى بعضهما البعض، فقد يُنشئان حلقةً لا يتم فيها جمع أيٍّ منهما، لأن مراجعهما المتبادلة لا تسمح أبدًا بأن يصبح عدد مراجعهما صفرًا. تستخدم بعض أنظمة جمع البيانات المهملة التي تعتمد على عدّ المراجع (مثل تلك الموجودة في CPython ) خوارزمياتٍ مُحددةً للكشف عن الحلقات لمعالجة هذه المشكلة. [ 16 ] تتمثل استراتيجية أخرى في استخدام المراجع الضعيفة لمؤشرات الرجوع التي تُنشئ الحلقات. في ظل عدّ المراجع، يُشبه المرجع الضعيف المرجع الضعيف في جامع البيانات المهملة التتبعي. إنه كائن مرجعي خاص لا يؤدي وجوده إلى زيادة عدد مراجع الكائن المُشار إليه. علاوةً على ذلك، يُعد المرجع الضعيف آمنًا، فعندما يصبح الكائن المُشار إليه بيانات مهملة، يتلاشى أي مرجع ضعيف إليه ، بدلًا من السماح له بالبقاء مُعلقًا، مما يعني أنه يتحول إلى قيمةٍ يُمكن التنبؤ بها، مثل مرجع فارغ.
المساحة الإضافية (عدد المراجع)
يتطلب عدّ المراجع تخصيص مساحة لكل كائن لتخزين عدد المراجع الخاصة به. يمكن تخزين هذا العدد بجوار ذاكرة الكائن أو في جدول جانبي في مكان آخر، ولكن في كلتا الحالتين، يحتاج كل كائن يتم عدّ مراجعه إلى مساحة تخزين إضافية. تُستخدم عادةً مساحة ذاكرة بحجم مؤشر غير مُوقّع لهذه المهمة، مما يعني أنه يجب تخصيص 32 أو 64 بتًا لتخزين عدد المراجع لكل كائن. في بعض الأنظمة، قد يكون من الممكن تخفيف هذا العبء باستخدام مؤشر مُعلّم لتخزين عدد المراجع في المناطق غير المستخدمة من ذاكرة الكائن. غالبًا، لا تسمح بنية النظام للبرامج بالوصول إلى النطاق الكامل لعناوين الذاكرة التي يمكن تخزينها بحجم المؤشر الأصلي؛ حيث يتم تجاهل عدد معين من البتات العليا في العنوان أو يُشترط أن تكون أصفارًا. إذا كان للكائن مؤشر موثوق في موقع معين، فيمكن تخزين عدد المراجع في البتات غير المستخدمة من المؤشر. على سبيل المثال، يحتوي كل كائن في لغة Objective-C على مؤشر إلى فئته في بداية ذاكرته. في بنية ARM64 باستخدام نظام التشغيل iOS 7 ، تُستخدم 19 بتة غير مستخدمة من مؤشر هذه الفئة لتخزين عدد مراجع الكائن. [ 17 ] [ 18 ]
زيادة/نقصان السرعة
في التطبيقات البسيطة، يتطلب كل تعيين لمرجع، وكل مرجع يخرج عن نطاق التعريف، تعديل عداد مرجع واحد أو أكثر. مع ذلك، في الحالة الشائعة عند نسخ مرجع من متغير نطاق خارجي إلى متغير نطاق داخلي، بحيث يكون عمر المتغير الداخلي محدودًا بعمر المتغير الخارجي، يمكن الاستغناء عن زيادة المرجع. يصبح المتغير الخارجي هو "مالك" المرجع. في لغة البرمجة C++، تُنفذ هذه التقنية بسهولة وتُوضح باستخدام المراجع const. عادةً ما يُنفذ عد المراجع في C++ باستخدام " المؤشرات الذكية " [ 19 ] التي تُدير دوالها البانية والمدمرة ومعاملات التعيين المراجع. يمكن تمرير المؤشر الذكي كمرجع إلى دالة، مما يُغني عن الحاجة إلى إنشاء مؤشر ذكي جديد (مما يزيد عدد المراجع عند الدخول إلى الدالة وينقصه عند الخروج منها). بدلًا من ذلك، تتلقى الدالة مرجعًا إلى المؤشر الذكي الذي يتم إنشاؤه بتكلفة منخفضة. تعتمد طريقة دويتش-بوبرو لحساب المراجع على حقيقة أن معظم تحديثات عداد المراجع تُنشأ في الواقع من مراجع مخزنة في متغيرات محلية. تتجاهل هذه الطريقة هذه المراجع، وتحسب فقط المراجع الموجودة في الذاكرة الديناميكية (heap). ولكن قبل حذف كائن ذي عداد مراجع يساوي صفرًا، يجب على النظام التحقق، من خلال مسح المكدس وتسجيله، من عدم وجود أي مرجع آخر إليه. ويمكن تحقيق انخفاض كبير إضافي في الحمل الزائد لتحديثات العداد من خلال دمج التحديثات الذي قدمه ليفانوني وبيترانك . [ 20 ] [ 21 ] لنفترض مؤشرًا يتم تحديثه عدة مرات خلال فترة زمنية محددة من التنفيذ. يشير أولًا إلى كائن O1، ثم إلى كائن آخر O2، وهكذا حتى يشير في نهاية الفترة إلى كائن ما On. عادةً ما تُنفذ خوارزمية حساب المراجع التحديثات التالية rc(O1)--: rc(O2)++، ، rc(O2)--، rc(O3)++، rc(O3)--، ...، rc(On)++. لكن معظم هذه التحديثات زائدة عن الحاجة. ولتقييم عداد المراجع بشكل صحيح في نهاية الفترة، يكفي تنفيذ التحديثين rc(O1)--و rc(On)++. قام ليفانوني وبيترانك بقياس إزالة أكثر من 99٪ من تحديثات العداد في معايير جافا النموذجية.
يتطلب الذرية
عند استخدامها في بيئة متعددة الخيوط ، قد تتطلب هذه التعديلات (الزيادة والنقصان) عمليات ذرية مثل المقارنة والتبديل ، على الأقل بالنسبة للكائنات المشتركة، أو التي يُحتمل مشاركتها بين خيوط متعددة. تُعدّ العمليات الذرية مكلفة على المعالجات المتعددة، وتزداد تكلفتها عند محاكاتها باستخدام خوارزميات برمجية. يمكن تجنب هذه المشكلة بإضافة عدادات مرجعية لكل خيط أو لكل وحدة معالجة مركزية، والوصول إلى العداد المرجعي العام فقط عندما تصبح العدادات المرجعية المحلية صفرًا أو تتجاوز الصفر (أو، بدلاً من ذلك، استخدام شجرة ثنائية للعدادات المرجعية، أو حتى التخلي عن التدمير الحتمي مقابل عدم وجود عداد مرجعي عام على الإطلاق)، ولكن هذا يُضيف عبئًا كبيرًا على الذاكرة، وبالتالي يميل إلى أن يكون مفيدًا فقط في حالات خاصة (يُستخدم، على سبيل المثال، في عدّ المراجع لوحدات نواة لينكس). يمكن استخدام دمج التحديثات بواسطة ليفانوني وبيترانك [ 20 ] [ 21 ] لإزالة جميع العمليات الذرية من حاجز الكتابة. لا يتم تحديث العدادات بواسطة خيوط البرنامج أثناء تنفيذه، بل يتم تعديلها فقط بواسطة جامع البيانات الذي يعمل كخيط إضافي مستقل دون تزامن. يمكن استخدام هذه الطريقة كآلية لإيقاف جميع العمليات في البرامج المتوازية، وكذلك مع جامع عدادات مرجعية متزامن.
ليس في الوقت الفعلي
لا توفر التطبيقات البسيطة لعدّ المراجع عادةً سلوكًا فوريًا، لأن أي عملية إسناد لمؤشر قد تؤدي إلى تحرير عدد من الكائنات، لا يتجاوز حجمها الإجمالي حجم الذاكرة المخصصة، بشكل متكرر بينما يكون الخيط غير قادر على أداء مهام أخرى. يمكن تجنب هذه المشكلة بتفويض تحرير الكائنات غير المُشار إليها إلى خيوط أخرى، على حساب زيادة في الحمل.

تحليل الهروب

تحليل الهروب هو أسلوب يُستخدم أثناء الترجمة لتحويل تخصيصات الذاكرة في الكومة إلى تخصيصات في المكدس ، مما يقلل من حجم عملية جمع البيانات المهملة. يحدد هذا التحليل ما إذا كان الكائن المُخصص داخل دالة ما قابلاً للوصول إليه من خارجها. إذا وُجد أن تخصيصًا محليًا للدالة قابل للوصول إليه من دالة أخرى أو خيط معالجة آخر، يُقال إن التخصيص "هرب" ولا يمكن إجراؤه على المكدس. وإلا، فقد يُخصص الكائن مباشرةً على المكدس ويُحرر عند انتهاء الدالة، متجاوزًا بذلك الكومة وما يرتبط بها من تكاليف إدارة الذاكرة. [ 22 ]

التوافر

بشكل عام، من المرجح أن تتضمن لغات البرمجة عالية المستوى خاصية جمع البيانات المهملة كميزة قياسية. في بعض اللغات التي تفتقر إلى هذه الخاصية، يمكن إضافتها عبر مكتبة، كما هو الحال مع جامع البيانات المهملة Boehm للغتين C و C++.

تتضمن معظم لغات البرمجة الوظيفية ، مثل ML و Haskell و APL ، خاصية جمع البيانات المهملة. وتُعد لغة Lisp جديرة بالذكر بشكل خاص لكونها أول لغة برمجة وظيفية وأول لغة تُدخل خاصية جمع البيانات المهملة. [ 23 ]

تميل لغات البرمجة الديناميكية الأخرى، مثل روبي وجوليا (ولكن ليس بيرل 5 أو بي إتش بي قبل الإصدار 5.3، [ 24 ] حيث تستخدم كلتاهما عدّ المراجع)، وجافا سكريبت وإي سي إم إيه سكريبت، إلى استخدام جمع البيانات المهملة. أما لغات البرمجة كائنية التوجه، مثل سمول توك ، وأو أو ريكس ، وآر بي إل، وجافا ، فتُوفر عادةً جمعًا مُدمجًا للبيانات المهملة. ومن الاستثناءات البارزة لغتا سي++ ودلفي ، اللتان تحتويان على دوال تدمير . 

أساسي

كثيراً ما استخدمت لغتا BASIC و Logo خاصية جمع البيانات المهملة لأنواع البيانات ذات الأطوال المتغيرة، مثل السلاسل النصية والقوائم، وذلك لتجنب إثقال كاهل المبرمجين بتفاصيل إدارة الذاكرة. في جهاز Altair 8800 ، قد تتسبب البرامج التي تحتوي على العديد من متغيرات السلاسل النصية ومساحة تخزين محدودة في حدوث فترات توقف طويلة بسبب عملية جمع البيانات المهملة. [ 25 ] وبالمثل، تقوم خوارزمية جمع البيانات المهملة في مترجم لغة Applesoft BASIC بفحص واصفات السلاسل النصية بشكل متكرر بحثاً عن السلسلة النصية ذات العنوان الأعلى لضغطها في الذاكرة الرئيسية، مما ينتج عنهيا(ن2){\displaystyle O(n^{2})}[ 26 ] ويتوقف البرنامج لفترات تتراوح بين بضع ثوانٍ وبضع دقائق. [ 27 ] يقوم جامع البيانات المهملة البديل للغة Applesoft BASIC، الذي طوره راندي ويغينتون، بتحديد مجموعة من السلاسل النصية في كل دورة على الذاكرة، مما يقلل وقت التجميع بشكل كبير. [ 28 ] يوفر BASIC.SYSTEM، الذي صدر مع ProDOS عام 1983، جامع بيانات مهملة يعمل بنظام النوافذ للغة BASIC وهو أسرع بكثير. [ 29 ]

لغة C ولغة C++

لم تُقدّم لغة C دعمًا رسميًا لجمع البيانات المهملة. أضافت لغة C++ دعمًا لجمع البيانات المهملة في الإصدار C++11 إلى المكتبة القياسية، إلا أنه أُزيل في الإصدار C++23 لعدم وجود مُترجمات تدعم هذه الميزة. [ 30 ] وكانت الميزات التي كانت جزءًا من ذلك متعلقة بأمان المؤشرات. [ 31 ]

Although garbage collection support in the standard library was removed, some garbage collectors such as Boehm garbage collector (for C and C++) can still be used. Boehm GC uses tracing garbage collection. It can also be used in leak detection mode, where memory management is still manual however leaks and double-free errors can be detected and reported. Its use can be called from the header <gc.h>.

One can still abstract away manual object destructions in C++ by using the "resource acquisition is initialization" (RAII) idiom and smart pointers. std::unique_ptr ties lifetimes to ownership, while std::shared_ptr uses reference counting to determine lifetime. std::weak_ptr can be used to obtain a pointer without increasing the reference count. Unlike garbage collection, RAII is deterministic.

Objective-C

While the Objective-C traditionally had no garbage collection, with the release of OS X 10.5 in 2007 Apple introduced garbage collection for Objective-C 2.0, using an in-house developed runtime collector.[32] However, with the 2012 release of OS X 10.8, garbage collection was deprecated in favor of LLVM's automatic reference counter (ARC) that was introduced with OS X 10.7.[33] Furthermore, since May 2015 Apple even forbade the usage of garbage collection for new OS X applications in the App Store.[34][35] For iOS, garbage collection has never been introduced due to problems in application responsivity and performance;[13][36] instead, iOS uses ARC.[37][38]

Limited environments

Garbage collection is rarely used on embedded or real-time systems because of the usual need for very tight control over the use of limited resources. However, garbage collectors compatible with many limited environments have been developed.[39] The Microsoft .NET Micro Framework, .NET nanoFramework[40] and Java Platform, Micro Edition are embedded software platforms that, like their larger cousins, include garbage collection.

Java

Garbage collectors available in JavaOpenJDKs virtual machine (JVM) include:

  • Serial
  • Parallel
  • CMS (Concurrent Mark Sweep)
  • G1 (التخلص من النفايات أولاً)
  • ZGC (جامع القمامة Z)
  • إبسيلون
  • شيناندواه
  • GenZGC (الجيل ZGC)
  • جينشن (جيل شيناندواه)
  • IBM Metronome (متوفر فقط في IBM OpenJDK)
  • SAP (فقط في SAP OpenJDK)
  • Azul C4 (جامع الضغط المتزامن المستمر) [ 41 ] (فقط في Azul Systems OpenJDK)

الاستخدام في وقت الترجمة

يُعد جمع البيانات المهملة في وقت الترجمة شكلاً من أشكال التحليل الثابت الذي يسمح بإعادة استخدام الذاكرة واستعادتها بناءً على الثوابت المعروفة أثناء الترجمة.

تمت دراسة هذا النوع من جمع البيانات المهملة في لغة برمجة ميركوري ، [ 42 ] وشهد استخدامًا أكبر مع إدخال عداد المراجع التلقائي (ARC) الخاص بـ LLVM في نظام أبل البيئي (iOS و OS X) في عام 2011. [ 37 ] [ 38 ] [ 34 ] 

أنظمة الوقت الحقيقي

تم تطوير خوارزميات جمع البيانات المهملة التزايدية والمتزامنة واللحظية، على سبيل المثال من قبل هنري بيكر وهنري ليبرمان . [ 43 ] [ 44 ] [ 45 ]

في خوارزمية بيكر، يتم تخصيص الذاكرة في أحد نصفي منطقة واحدة. عندما تمتلئ نصفها، تُجرى عملية جمع البيانات المهملة، حيث تُنقل الكائنات النشطة إلى النصف الآخر، بينما تُحرر الكائنات المتبقية ضمنيًا. يجب على البرنامج قيد التشغيل (المُعدِّل) التحقق من وجود أي كائن يشير إليه في النصف الصحيح، وإذا لم يكن كذلك، ينقله إلى النصف الآخر، بينما تقوم مهمة في الخلفية بالعثور على جميع الكائنات. [ 46 ]

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

تتضمن بعض بنى الحواسيب ذات اللغات عالية المستوى دعمًا للأجهزة لجمع البيانات المهملة في الوقت الفعلي.

تستخدم معظم تطبيقات جامعات البيانات المهملة في الوقت الحقيقي تقنية التتبع . وتلبي هذه الجامعات قيود الوقت الحقيقي الصارمة عند استخدامها مع نظام تشغيل يعمل في الوقت الحقيقي. [ 47 ]

انظر أيضاً

مراجع

  1. أبيلسون، هارولد؛ سوسمان، جيرالد جاي؛ سوسمان، جولي (2016). بنية وتفسير برامج الحاسوب (ملف PDF) (  الطبعة الثانية). كامبريدج، ماساتشوستس، الولايات المتحدة الأمريكية: مطبعة معهد ماساتشوستس للتكنولوجيا . الصفحات 734-736 . 
  2. 1 2 "ما هي عملية جمع البيانات المهملة (GC) في البرمجة؟" . التخزين . تم الاسترجاع في 21-06-2024 .
  3. مكارثي، جون (1960). "الدوال التكرارية للتعبيرات الرمزية وحسابها آليًا، الجزء الأول" . مجلة اتصالات رابطة مكائن ​​الحوسبة . 3 (4): 184-195 . doi : 10.1145/367177.367199 . S2CID 1489409. تاريخ الاسترجاع: 29 مايو 2009 . 
  4. "نظرة عامة - لغة البرمجة D" . dlang.org . Digital Mars . تم الاطلاع عليه بتاريخ 29-07-2014 .
  5. هيلر، مارتن (2023-02-03). "ما هي عملية جمع البيانات المهملة؟ إدارة الذاكرة الآلية لبرامجك" . إنفوورلد . تم الاسترجاع في 2024-06-21 .
  6. "دليل جمع البيانات المهملة في البرمجة" . freeCodeCamp.org . 16 يناير 2020. تاريخ الاسترجاع: 21 يونيو 2024 .
  7. "جمع البيانات المهملة - لغة البرمجة D" . dlang.org . تم الاطلاع عليه بتاريخ 17-10-2022 .
  8. "جمع النفايات" . rebelsky.cs.grinnell.edu . تم الاطلاع عليه بتاريخ 13 يناير 2024 .
  9. هيلر، مارتن (2023-02-03). "ما هي عملية جمع البيانات المهملة؟ إدارة الذاكرة الآلية لبرامجك" . إنفوورلد . تم الاسترجاع في 2024-06-21 .
  10. مايكروسوفت (28 فبراير 2023). "أساسيات جمع البيانات المهملة | مايكروسوفت ليرن" . تم الاطلاع عليه بتاريخ 29 مارس 2023 .
  11. زورن، بنيامين (22 يناير 1993). "التكلفة المقاسة لجمع البيانات المهملة بشكل متحفظ". البرمجيات: الممارسة والخبرة . 23 (7). قسم علوم الحاسوب، جامعة كولورادو بولدر : 733-756 . CiteSeerX 10.1.1.14.1816 . doi : 10.1002/spe.4380230704 . S2CID 16182444 .  
  12. هيرتز، ماثيو؛ بيرغر، إيمري د. (2005). "قياس أداء جمع البيانات المهملة مقابل إدارة الذاكرة الصريحة" (ملف PDF) . وقائع المؤتمر السنوي العشرين لجمعية ACM SIGPLAN حول البرمجة الكائنية والأنظمة واللغات والتطبيقات - OOPSLA '05 . الصفحات 313-326 . doi : 10.1145/1094811.1094836 . ISBN  1-59593031-0S2CID 6570650. مؤرشف (PDF) من الأصل بتاريخ 2012-04-02 . تم الاطلاع عليه بتاريخ 2015-03-15 . 
  13. 1 2 "انطلاق أدوات المطورين - الجلسة 300" (ملف PDF) . مؤتمر WWDC 2011. شركة آبل . 24 يونيو 2011. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 4 سبتمبر 2023. تم الاطلاع عليه بتاريخ 27 مارس 2015 .
  14. "نظرية موحدة لجمع النفايات" . www.cs.cornell.edu . 2019-11-08 . تاريخ الاسترجاع 2026-04-22 .
  15. مايكروسوفت (27 يناير 2009). "جمع البيانات المهملة باستخدام عد المراجع" . تم الاطلاع عليه بتاريخ 29 مارس 2023 .
  16. "عدد المراجع" . توسيع وتضمين مترجم بايثون . 21-02-2008 . تم الاسترجاع في 22-05-2014 .
  17. آش، مايك. "أسئلة وأجوبة يوم الجمعة 27-09-2013: ARM64 وأنت" . mikeash.com . تم الاطلاع عليه بتاريخ 27-04-2014 .
  18. "متجر الهامستر: [ شرح Objective- C] : مجموعة تعليمات غير مؤشرة" . Sealiesoftware.com. 24-09-2013 . تم الاسترجاع في 27-04-2014 .
  19. ^ بيبينجر ، رولاند (2005-05-03) [2005-04-17]. "RAII والكائنات الديناميكية والمصانع في C++" .
  20. 1 2 ليفانوني، يوسي؛ بيترانك، إيريز (2001). "جامع قمامة يعمل على عدّ المراجع أثناء التشغيل للغة جافا" . وقائع المؤتمر السادس عشر لجمعية ACM SIGPLAN حول البرمجة الكائنية والأنظمة واللغات والتطبيقات . OOPSLA 2001. الصفحات 367-380 . doi : 10.1145/504282.504309 . 
  21. 1 2 ليفانوني، يوسي؛ بيترانك، إيريز (2006). "جامع قمامة يعمل على عدّ المراجع أثناء التشغيل للغة جافا" . معاملات ACM لأنظمة لغات البرمجة . 28 : 31-69 . CiteSeerX 10.1.1.15.9106 . doi : 10.1145/1111596.1111597 . S2CID 14777709 .  
  22. سالانياك، غيوم؛ يوفين، سيرجيو؛ غاربرفيتسكي، دييغو (24-05-2005). "تحليل الهروب السريع لإدارة الذاكرة القائمة على المناطق" . الملاحظات الإلكترونية في علوم الحاسوب النظرية . 131 : 99-110 . doi : 10.1016/j.entcs.2005.01.026 .
  23. تشيسنال، ديفيد (2011-01-12). لغات البرمجة المؤثرة، الجزء 4: لغة ليسب .
  24. "PHP: اعتبارات الأداء" . php.net . تم الاطلاع عليه بتاريخ 14 يناير 2015 .
  25. "دليل مرجعي لجهاز Altair 8800 Basic 4.1" (ملف PDF) . الأرشيف الرقمي لتقنية Vintage . أبريل 1977. صفحة 108. مؤرشف (ملف PDF) من الأصل بتاريخ 29-06-2021 . تم الاطلاع عليه بتاريخ 29-06-2021 . 
  26. «لقد قمت ببعض العمل لتسريع عملية جمع البيانات المهملة للسلاسل النصية في نظام Applesoft...» Hacker News . تم الاطلاع عليه بتاريخ 29-06-2021 .
  27. ليتل، غاري ب. (1985). داخل جهاز أبل IIc . بوي، ماريلاند: شركة برادي للاتصالات. ص 82. ISBN  0-89303-564-5تم الاطلاع عليه بتاريخ 29-06-2021 .
  28. "جمع القمامة السريع". اتصل بشركة آبل : 40-45 . يناير 1981.
  29. وورث، دون (1984). ما وراء نظام التشغيل أبل برو دوس (ملف PDF) (طبعة مارس 1985 ). تشاتسوورث، كاليفورنيا، الولايات المتحدة الأمريكية: كواليتي سوفتوير. الصفحات 2-6 . ISBN   0-912985-05-4تمت أرشفة الملف (PDF) من النسخة الأصلية بتاريخ 2008-12-03 . تم الاطلاع عليه بتاريخ 2021-06-29 .
  30. جيه إف باستيان؛ أليسدير ميريديث (2021-04-16). "إزالة دعم جمع البيانات المهملة" .
  31. "std::pointer_safety - cppreference.com" . en.cppreference.com . تم الاطلاع عليه بتاريخ 9 ديسمبر 2024 .
  32. "نظرة عامة على Objective-C 2.0" . مؤرشف من الأصل بتاريخ 24-07-2010.
  33. سيراكوزا، جون (2011-07-20). "Mac OS X 10.7 Lion: مراجعة Ars Technica" .
  34. ١ ٢ "أبل تقول إن مطوري تطبيقات ماك يجب أن ينتقلوا إلى إدارة ذاكرة ARC بحلول شهر مايو" . AppleInsider . ٢٠ فبراير ٢٠١٥.
  35. ^ سيشون ، فالديمار (2015/02/21). "متجر التطبيقات: برنامج Apple entfernt مع مجموعة البيانات المهملة" . Heise.de . تم الاسترجاع 2015/03/30 .
  36. سيلفا، بريشوس (18 نوفمبر 2014). "iOS 8 مقابل Android 5.0 Lollipop: أبل تتفوق على جوجل بكفاءة الذاكرة" . صحيفة إنترناشونال بيزنس تايمز . مؤرشف من الأصل في 3 أبريل 2015. تم الاطلاع عليه في 7 أبريل 2015 .
  37. 1 2 نابيير، روب؛ كومار، موغونث (2012-11-20). برمجة iOS 6: تجاوز الحدود . جون وايلي وأولاده . ISBN 978-1-11844997-4تم الاطلاع عليه بتاريخ 30-03-2015 .
  38. 1 2 كروز، خوسيه آر سي (22 مايو 2012). "العد المرجعي التلقائي على نظام iOS" . دكتور دوبس . مؤرشف من الأصل في 16 مايو 2020. تم الاسترجاع في 30 مارس 2015 .
  39. فو، وي؛ هاوزر، كارل (2005). "إطار عمل لجمع البيانات المهملة في الوقت الحقيقي للأنظمة المدمجة". وقائع ورشة عمل 2005 حول البرمجيات والمترجمات للأنظمة المدمجة - SCOPES '05 . الصفحات 20-26 . doi : 10.1145/1140389.1140392 . ISBN  1-59593207-0. S2CID 8635481 . 
  40. ".NET nanoFramework" .
  41. تين، جيل؛ إيينجار، بالاجي؛ وولف، مايكل (2011). "C4: جامع الضغط المتزامن المستمر" (ملف PDF) . ISMM '11: وقائع الندوة الدولية لإدارة الذاكرة . doi : 10.1145/1993478 . ISBN 978-1-45030263-0تمت أرشفة الملف (PDF) من النسخة الأصلية بتاريخ 2017-08-09.
  42. مازور، نانسي (مايو 2004). جمع البيانات المهملة في وقت الترجمة للغة ميركوري التصريحية (ملف PDF) (أطروحة). جامعة لوفين الكاثوليكية . مؤرشفة (ملف PDF) من الأصل بتاريخ 27 أبريل 2014.
  43. هولسبيرجن، لورنز؛ وينتربوتوم، فيل (1998). "جمع البيانات المهملة المتزامن للغاية بتقنية الوسم والمسح دون تزامن دقيق" (ملف PDF) . وقائع الندوة الدولية الأولى لإدارة الذاكرة - ISMM '98 . الصفحات 166-175 . doi : 10.1145/286860.286878 . ISBN  1-58113114-3. S2CID 14399427 . مؤرشف (PDF) من الأصل بتاريخ 2008-05-13. 
  44. "الأسئلة الشائعة حول GC" .
  45. ليبرمان، هنري؛ هيويت، كارل (1983). "جامع قمامة في الوقت الحقيقي يعتمد على دورة حياة الكائنات" . اتصالات رابطة مكائن ​​الحوسبة . 26 (6): 419-429 . doi : 10.1145/358141.358147 . hdl : 1721.1/6335 . S2CID 14161480 . 
  46. بيكر، هنري ج. (1978). "معالجة القوائم في الوقت الحقيقي على حاسوب تسلسلي". اتصالات رابطة آلات الحوسبة . 21 (4): 280-294 . doi : 10.1145/359460.359470 . hdl : 1721.1/41976 . S2CID 17661259 . انظر أيضًا الوصف
  47. ماكلوسكي؛ بيكون؛ تشينغ؛ غروف (2008)، ستاكاتو: جامع قمامة مضغوط متوازي ومتزامن في الوقت الحقيقي للمعالجات المتعددة (PDF) ، مؤرشف (PDF) من الأصل في 11 مارس 2014

للمزيد من القراءة