جامع النفايات في لغة الجافا Garbage Collector أو اختصاراً GC. رغم قساوته فهو يعتبر من الأدوات التي تلطف الحياة البرمجية بجمعها لمخلفات المبرمجين.
ما هو جامع النفايات وفيما يستخدم!!
كثير من المبرمجين يكملون برمجتهم لبرامجهم مستمتعين بعمل جامع النفايات و ربما يعرفون بوجوده ولكن لا يعرفون طريقة عمله.
هل هذا يعني أنهم لا يرغبون بمعرفة التفاصيل؟ لا بكل تأكيد ولكن شرح طريقة عمله ليست منتشرة رغم بساطتها. لذا أحببت أن اقدم في هذه التدوينة شرحاً عن طريقة عمل جامع النفايات. لنطلع على جزء مهم من أجزاء الجافا نتعامل معه يومياً دون أن نعرف تفاصيله.
إذا لم تكن قد رأيته من قبل – نعم تستطيع أن تراه – ،فبإمكانك مشاهدته باتباعتك للخطوات التي ذكرتها في تدوينتي عن مشاهدة خفايا جامع النفايات.
المهمة العظيمة التي يؤديها هي أنه يجعل المبرمج يكتب شفراته البرمجية و ينتج برامجه دون أن يعبأ كثيراً بإدارة الذاكرة و ما يحدث بالذاكرة.
لا أرغب أن يذهب تفكيرك إلى طريق خاطئ، لذا سأوضح لك هذه النقطة. عندما نذكر جامع النفايات فإننا لا نتحدث عن آلة أو جسم حقيقي. بل إن جامع النفايات هو عملية Process يتم تنفيذها لإدارة المخلفات البرمجية. دوماً ضع في ذهنك هذه المعلومة حتى لا يختلط الأمر.
الهيكل الداخلي العجيب لجامع النفايات
ما يحدث بالذاكرة يديره جامع النفايات بدلاً عن المبرمج. و ما دمنا نتحدث عن الذاكرة فاعلم ان المكان الذي يديره يسمى وحدة التخزين المؤقت Heap.
وهو يقسم وحدة التخزين المؤقت هذه إلى عدة أقسام، ما يهمنا فيها فيما يتعلق بالبرمجة ثلاث.
- الجيل الشاب young generation.
- الجيل القديم old generation.
- والجيل الدائم permanent generation.
أعتقد أن إسم الجيل الشاب يعبر عن محتواه، فهذا الجزء يحتوي على المتغيرات الشابة المُنشأة حديثاً. أما الجيل القديم فيحتوي على المتغيرات التي مرت عبر مرحلة الشباب ثم هرمت فتحولت إلى الجيل القديم.
الجيل الدائم يأتي بمفهوم مختلف عن سابقيه. يحتوي الجيل الدائم ليس على متغيرات، بل على البيانات الوصفية Metadata الخاصة بالأصناف و الدوال. و تستخدمة آلة جافا الافتراضية JVM البيانات الوصفية بالجيل الدائم من أجل الوصول إلى الأصناف و الدوال. و قد تحذف هذه المعلومات في حال عدم الحاجة إليها.
في داخل الجيل الشاب توجد عدة أقسام:
- عدن (إيدن) Eden فضلت تسميته عدن لإعتقادي بأن تسميته أتت من إسم جنة عدن.
- S0 و S1 هما مساحتاتا الناجين من عملية تنظيف جامع النفايات survivors 1 & 2.
قصة رحلة الحياة و سر النجاة من جامع النفايات
عندما يتم انشاء المتغير لأول مرة يتم إنشاءه في عدن. هذا الجزء المسمى عدن يحتوي دوماً على احدث المتغيرات التي تنشأ من تطبيقك، فوراً يذهب إلى عدن. ذاكرة عدن لها مساحة محددة، ولكن عندما تمتلئ هذه المساحة بالمتغيرات و الدوال و الأصناف عندها يأتي جامع النفايات ليؤدي بعض المهام.
من المهم أن تعلم أن جامع النفايات يحتفظ بمؤشر لكل عنصر بالذاكرة تحت الإستخدام. فإذا انتفت الحاجة إلى هذا العنصر يُزال منه المؤشر، و بالتالي عند امتلاء ذاكرة عدن فإنه يستطيع معرفة العناصر التي ما زال برنامجك بحاجة إليها و العناصر التي لن تُستخدم.
عندها يُزيل العناصر التي زالت الحاجة لها و ينقل البيانات التي ما زالت الحاجة لها قائمة إلى ذاكرة s0.
عند نقل عنصر من ذاكرة عدن إلى ذاكرة s0 هذا يعني أن عمره أصبح 1، و كل عملية إنتقال من ذاكرة إلى ذاكرة أخرى تعني أن عمر العنصر قد زاد بـ 1.
تستمر عملية تفريغ البيانات من ذاكرة عدن و حذف المخلفات و نقل المهم إلى ذاكرة s0 إلى أن تمتلئ ذاكرة s0، فيأتي جامع النفايات الآن لينفذ عملية مختلفة، سيبحث عن العناصر الموجودة بـ s0 و لا يوجد بها مؤشر (إنتفت الحاجة إليها و أصبح مخلفات) فيحذف هذه العناصر و ينقل العناصر التي ما زالت الحاجة إليها قائمة إلى s1.
ملاحظة مهمه:
لا تنسى أن في كل عملية نقل يزداد عمر العنصر بـ 1، و هذا يعني أن العناصر الموجودة بـ s1 الآن اصبح عمرها 2.
ركز الآن في هذه النقطة، حتى الآن لدينا عناصر ناجية موجودة بالذاكرة s1 و يقوم جامع النفايات بوضع العناصر الشابة الجديدة بذاكرة عدن، عندما تمتلئ ذاكرة عدن هذه المرة سيؤدي جامع النفايات عملية إضافية.
الطبيعي هو أن ينقل جامع النفايات العناصر الناجية من ذاكرة عدن إلى ذاكرة s0 و التي سيصبح عمرها 1 ولكن هذه المرة سيضيف عملية أخرى.
أيضاً سيجري عملية تنظيف صغرى لذاكرة s1، يتخلص من العناصر بدون مؤشر و ينقل العناصر التي ما زالت لها حاجة إلى ذاكرة s0، و ماذا أيضاً؟
سيزداد عمر العناصر الناجية من s1 بواحد، و بالتالي تصبح أكبر عمراً.
جميع العناصر بين خيارين، إما أن تكون ما زالت مفيدة فستمر حياتها أو أن يفتك بها جامع النفايات.
يجب أن تتساءل، لماذا يهتم جامع النفايات بزيادة عمر العناصر الناجية في كل مرة؟! سؤال مهم… لا تنسى أن هناك ذاكرة لم يلمسها الجامع حتى الآن…
إختلاف حياة الجيل القديم
الإهتمام بالعمر هو من أجل نقل العناصر التي تصل إلى عمر معين إلى ذاكرة الجيل القديم. عندما تصل العناصر بذاكرة الناجين s0 أو s1 إلى العمر الذي تم تعريفه مسبقاً، عندها يتم نقل هذه العناصر إلى ذاكرة الجيل القديم.
هل لاحظت كم دورة سيمر عليها العنصر الذي يصل الى ذاكرة الجيل القديم؟ هذا يعني أن هذا العنصر مهم في برنامج و ربما تم تعريفه في بداية البرنامج و سيُستخدم مرة أخرى في نهاية البرنامج!
عندما تمتلئ ذاكرة الجيل القديم ماذا سيفعل جامع النفايات؟ سيؤدي عملية تنظيف كبرى، لا يوجد مكان آخر ولا زيادة عمر ولا غيره، فقط يتخلص من العناصر التي زالت الحوجة إليها و يحتفظ بالعناصر المُستخدمة أو ستُستخدم مُستقبلاً.
هذه هي رحلة حياة المتغيرات في آلة جافا الإفتراضية، يتخلص منها جامع النفايات بصفة مستمرة مالم تحافظ على أهميتها بين المتغيرات! أليس هذا قانون الغاب؟!!
وصف مبسط ورائع جدا
شكراً لك أحمد
قلم ذهبي، بوركت اناملك.
سلمت أخي محمد، يسعدني وجودك في مدونة علوم والذّهبُ أنتم بارك الله فيك.
رائع.. شكراً لكم
الشكر لك أخي