القاتل البارد: جامع النفايات و رحلة حياة متغيرات الجافا

جامع النفايات في لغة الجافا Garbage Collector أو اختصاراً GC، رغم قساوته فهو يعتبر من الأدوات التي تلطف الحياة البرمجية بجمعها لنفايات المبرمجين.

كثير من المبرمجين يكملون برمجتهم لبرامجهم مستمتعين بعمل جامع النفايات و ربما يعرفون بوجوده ولكن لا يعرفون طريقة عمله.

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

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

المهمة العظيمة التي يؤديها جامع النفايات هي أنه يجعل المبرمج يكتب شفراته البرمجية و ينتج برامجه دون أن يعبأ كثيراً بإدارة الذاكرة و ما يحدث بالذاكرة.

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

الهيكل الداخلي العجيب لجامع النفايات

ما يحدث بالذاكرة يديره جامع النفايات بدلاً عن المبرمج، و ما دمنا نتحدث عن الذاكرة فاعلم ان المكان الذي يديره جامع النفايات يسمى وحدة التخزين المؤقت Heap.

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

  1. الجيل الشاب young generation.
  2. الجيل القديم old generation.
  3. الجيل الدائم permanent generation.

أنواع الذواكر جامع القمامة

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

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

في داخل الجيل الشاب توجد عدة أقسام

  1. عدن (إيدن) Eden فضلت تسميته عدن لإعتقادي بأن تسميته أتت من إسم جنة عدن.
  2. S0 و S1 هما مساحتاتا الناجين من عملية تنظيف جامع النفايات survivors 1 & 2.

قصة رحلة الحياة و سر النجاة من جامع النفايات

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

شرح جمع النفايات في الجافا

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

عندها يُزيل جامع النفايات العناصر التي زالت الحاجة لها و ينقل البيانات التي ما زالت الحاجة لها قائمة إلى ذاكرة s0.

عند نقل عنصر من ذاكرة عدن إلى ذاكرة s0 هذا يعني أن عمره أصبح 1، و كل عملية إنتقال من ذاكرة إلى ذاكرة أخرى تعني أن عمر العنصر قد زاد بـ 1.

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

ولا تنسى أن في كل عملية نقل يزداد عمر العنصر بـ 1، و هذا يعني أن العناصر الموجودة بـ s1 الآن اصبح عمرها 2.

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

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

أيضاً سيجري عملية تنظيف صغرى لذاكرة s1، يتخلص من العناصر بدون مؤشر و ينقل العناصر التي ما زالت لها حاجة إلى ذاكرة s0، و ماذا أيضاً؟

شرج جامع النفايات في جافا 2

سيزداد عمر العناصر الناجية من s1 بواحد، و بالتالي تصبح أكبر عمراً.

جميع العناصر بين خيارين، إما أن تكون ما زالت مُفيدة فيزداد عمرها و تستمر حياتها أو أن يفتك بها جامع النفايات.

يجب أن تتساءل، لماذا يهتم جامع النفايات بزيادة عمر العناصر الناجية في كل مرة؟! سؤال مهم… لا تنسى أن هناك ذاكرة لم يلمسها جامع النفايات حتى الآن…

إختلاف حياة الجيل القديم

الإهتمام بالعمر هو من أجل نقل العناصر التي تصل إلى عمر معين إلى ذاكرة الجيل القديم، عندما تصل العناصر بذاكرة الناجين s0 أو s1 إلى العمر الذي تم تعريفه مسبقاً، عندها يتم نقل هذه العناصر إلى ذاكرة الجيل القديم.

هل لاحظت كم دورة سيمر عليها العنصر الذي يصل الى ذاكرة الجيل القديم؟ هذا يعني أن هذا العنصر مُهم في برنامج و ربما تم تعريفه في بداية البرنامج و سيُستخدم مرة أخرى في نهاية البرنامج!

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

هذه هي رحلة حياة المتغيرات في آلة جافا الإفتراضية، يتخلص منها جامع النفايات بصفة مستمرة مالم تُحافظ على أهميتها بين المتغيرات! أليس هذا قانون الغاب؟!!

مصطفى الطيب

صديقٌ لنُظمِ المعلُومات و عُلومِ الحَاسِب و مُختصٌ بهما، مُحبٌ للعِلمِ و نَشرِه. أُشاركُ معارفي و تَجاربي و خِبراتي في تَدويناتٍ و دوراتٍ من خلال مُدونةِ عُلوم.

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

‫6 تعليقات

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *