تكنولوجيا

ما المقصود بجمع القمامة وكيف تؤثر على أداء البرنامج؟ – CloudSavvy IT

شترستوك / سميت

جمع البيانات المهملة هو وظيفة للعديد من اللغات مثل C # و Java. على الرغم من أن الإدارة اليدوية للذاكرة مثل C ++ يمكن أن تكون سريعة جدًا ، إلا أن جمع البيانات المهملة تلقائيًا يمكن أن يحسن نوعية الحياة للمطورين. ومع ذلك ، فمن المهم أن نفهم تأثير الأداء للسماح للمقاول العام بمواصلة العمل.

كومة وكومة

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

هذه كومة سريع ومستخدم لأنواع القيم ذات حجم بايت ثابت. بالطبع ، هي نفس الذاكرة الفعلية مثل الكومة ، لكنها سريعة جدًا لأنها بنية بيانات مرتبة جدًا لأول مرة. عندما تنشئ متغيرًا محليًا ، فسيخزنه في المكدس ، وكلما خرجت وظيفتك وكان المتغير خارج النطاق ، فسيتم مسحه تلقائيًا من المكدس.

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

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

يعد تخصيص الكومة أيضًا أبطأ من تخصيص المكدس.

الكومة أبطأ بكثير ، ويجب تخصيص ذاكرة عليها وحذف الذاكرة منها. هذا ينطبق على جميع اللغات (مع أو بدون جامعي البيانات المهملة) التي تستخدم هذا النموذج.

نظف القمامة

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

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

البديل للإدارة اليدوية هو السماح للجهاز بالقيام بذلك نيابة عنك تلقائيًا. هذا هو ما يسمى بجمع القمامة.

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

على سبيل المثال ، خذ الكود الزائف التالي ، الذي ينشئ ويحذف الكائنات

item refToObject = new object()
refToObject = null

منذ refToObject لم يعد يقتبس new object() بعد الإنشاء ، سيرى جامع القمامة الكائن الجديد متدليًا دون الرجوع إليه من أي مكان ، وسيحذفه في المرة التالية التي يجمع فيها القمامة.

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

يمكن تشغيل عملية جمع القمامة في أي وقت ، وعادةً:

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

التأثير على الأداء

بالطبع ، جمع القمامة ليس مجانيًا على الإطلاق. إذا كان الأمر كذلك ، فستستخدمه كل لغة. GC بطيء جدًا ، ويرجع ذلك أساسًا إلى حاجته إلى تعليق تنفيذ البرنامج لجمع القمامة.

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

بشكل عام ، إنه سريع جدًا ، وعادة ما يكون أقل من بضعة أجزاء من الثانية على الأكثر. بالنسبة إلى .Net ، يعتمد هذا على نوع الذاكرة المراد مسحها ، لأنها تتعقب الذاكرة في “الأجيال” المختلفة:

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

سيتحقق GC من الكائنات في Gen0 ، ثم Gen1 ، ثم Gen2. نظرًا لأنها تحتوي فقط على كائنات مؤقتة أو تم إنشاؤها حديثًا ، فإن تنظيف Gen0 و Gen1 عادة ما يكون سريعًا جدًا ، لكن Gen2 يحتوي على الكثير من الذاكرة. قد يكون أداء “جمع البيانات المهملة بالكامل” أبطأ بكثير من عملية جمع البيانات المهملة المؤقتة.

كيف تحسن الأداء؟

إذن ، ما هي الإجراءات التي يمكنك اتخاذها لمنع حدوث ذلك؟ حسنًا ، في نهاية اليوم ، يجب التقاط القمامة الخاصة بك. الشيء الوحيد الذي يمكنك القيام به هو تقليل كمية القمامة التي يلقيها البرنامج.

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

على سبيل المثال ، يتم تكرار الكود التالي 10000 مرة ، وفي كل مرة يتم إنشاء قائمة جديدة لمعالجتها. ومع ذلك ، هذا أمر مروع في GC ، لذا فإن أفضل طريقة هي إنشاء قائمة كبيرة وتريد قائمة جديدة لمسحها بعد الانتهاء.

سيتم تشغيل الكود 10000 مرة وسيخصص 10000 قائمة غير مملوكة في الذاكرة في نهاية الوظيفة.قم بتشغيل قائمة جديدة قبل الحلقة الخاصة بالتخصيص الأول ، ثم قم بمسح البيانات أو إعادة تعيينها لتوفير مساحة الذاكرة وإنشاء البيانات المهملة.

في الواقع ، يتم ذلك عادةً من خلال “تجمع الكائنات” العام ، الذي يدير قائمة الكائنات التي يمكن “تأجيرها” للبرنامج. بعد اكتمال الكود ، يحرر الكائن إلى التجمع ويعيد تعيينه لإعادة استخدامه عند الطلب.

مقالات ذات صلة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني.

زر الذهاب إلى الأعلى