جامع القمامة (GC) هو مدير ذاكرة. تحتوي العديد من لغات البرمجة على GC مضمنة. تقوم هذه الميزة تلقائيًا بتخصيص وإلغاء تخصيص الذاكرة في البرنامج. يقوم بإصدار ذاكرة مقيدة وغير مستخدمة تؤدي إلى إبطاء تطبيقك.

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

كيف يعمل تخصيص الذاكرة؟

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

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

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

instagram viewer

كيف يعمل إلغاء تخصيص الذاكرة؟

يعد تخصيص الذاكرة عملية مماثلة لجميع لغات البرمجة. لكن الطريقة المقابلة لإلغاء تخصيص الذاكرة تميل إلى الاختلاف. هناك نوعان من طرق إلغاء تخصيص الذاكرة ؛ يدوي وتلقائي. يقوم GC بإلغاء التخصيص التلقائي.

إلغاء تخصيص الذاكرة بدون جامع القمامة

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

تحتوي المكتبة القياسية (stdlib.h) على الوظائف التي يستخدمها C لإدارة تخصيص الذاكرة الديناميكي. تشمل هذه الوظائف:

  • malloc (): يخصص حجمًا معينًا من الذاكرة ويعيد مؤشرًا إلى تلك الذاكرة. إذا كانت هناك ذاكرة غير كافية متوفرة في تجمع ذاكرة نظام التشغيل ، فإنها ترجع فارغة.
  • free (): يلغي تخصيص كتلة معينة من الذاكرة ويعيدها إلى تجمع ذاكرة نظام التشغيل.

مثال برنامج C

#تضمن
#تضمن

intرئيسي()
{
int * ptr ؛ // يعلن المؤشر
int ي ؛ // يعلن العداد

// تخصيص مساحة لـ 200 عدد صحيح
ptr = (int *) مالوك(200 * حجم(int));

// أدخل القيم الصحيحة في الذاكرة المخصصة
// وطباعة كل قيمة على وحدة التحكم
إلى عن على (ي = 0; ي < 200; ي ++)
{
ptr [j] = j ؛
printf("٪ d \ t" ، ptr [j]) ؛
}

// إلغاء تخصيص الذاكرة المخصصة مسبقًا
مجانا(ptr) ؛
إرجاع0;
}

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

إلغاء تخصيص الذاكرة مع جامع القمامة

تستخدم العديد من لغات البرمجة الشائعة GC لإدارة الذاكرة. هذا يجعل حياة المبرمجين الذين يستخدمون هذه اللغات أسهل بكثير. C # و Java هما لغتا برمجة تستخدمان GC.

C # GC

في ال لغة البرمجة C #، يدير GC تخصيص عناوين الذاكرة وإلغاء تخصيصها. لذلك ، لا يحتاج مبرمج C # إلى القلق بشأن إلغاء تخصيص كائن بعد أن يكمل الغرض منه.

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

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

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

جافا GC

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

  • القمامة أولاً (G1)
  • مسلسل
  • موازي
  • جامع القمامة Z (ZGC)

مُجمع البيانات المهملة G1 هو GC الافتراضي لجافا منذ إصدار Java Development Kit (JDK) 9. تنظم Java البيانات في كائنات وتخزن هذه الكائنات في كومة ذات حجم ثابت. يقوم جامع القمامة G1 بتقسيم الكومة إلى مناطق كومة ذات حجم متساوٍ. ثم تقوم بتقسيم مناطق الكومة هذه إلى قسمين ؛ الأجيال الشابة والكبيرة.

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

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

ما هي فوائد وجود جامع قمامة؟

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

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

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