JavaRush /مدونة جافا /Random-AR /المزيد عن جامع البيانات المهملة في جافا

المزيد عن جامع البيانات المهملة في جافا

نشرت في المجموعة
مرحبًا! في المحاضرة الأخيرة، تعرفنا لأول مرة على الآلية المدمجة في لغة جافا - جامع البيانات المهملة. إنه يعمل في الخلفية أثناء تشغيل برنامجك، حيث يقوم بتجميع الكائنات التي أصبحت غير ضرورية، والتي سيتم حذفها لاحقًا. بهذه الطريقة يحرر الذاكرة لإنشاء كائنات جديدة في المستقبل. في هذه المحاضرة سوف نلقي نظرة فاحصة على مبدأ عملها. على سبيل المثال، كيف وفي أي نقطة يصبح الكائن غير ضروري؟ وكيف يعرف جامع القمامة عن ذلك؟ سنجيب على هذه الأسئلة :) محاضرتنا هي أكثر من مجرد نظرة عامة: هذه المادة لا تحتاج إلى حفظ. الغرض منه هو توسيع آفاقك فيما يتعلق بعمل الذاكرة وجامع القمامة، لذلك يكفي قراءته وتعلم شيء جديد لنفسك :) هيا بنا! أول شيء عليك أن تتذكره هو أن أداة تجميع البيانات المهملة تعمل بالتوازي مع برنامجك . إنها ليست جزءًا منها وتعمل بشكل منفصل: لوصف ذلك، قدمنا ​​​​في المحاضرة الأخيرة تشبيهًا بالمكنسة الكهربائية الروبوتية. في الواقع، لم يكن هذا هو الحال دائمًا. في السابق، تم تصميم أداة تجميع البيانات المهملة بحيث تعمل في نفس سلسلة عمليات برنامجك. ووفقا لبعض الجدول الزمني، مرة واحدة كل بضع دقائق، بدأ التحقق من وجود كائنات غير ضرورية في البرنامج. كانت المشكلة أنه أثناء هذا الفحص وجمع البيانات المهملة، تجمد البرنامج ولم يتم تنفيذه. تخيل أنك تجلس في مكتب تعمل. ولكن بعد ذلك تأتي عاملة التنظيف وتحتاج إلى غسل الأرضيات في الغرفة. تقوم بطردك من خلف الكمبيوتر لمدة 5 دقائق وتنتظر حتى تنتهي من التنظيف. خلال هذا الوقت لا يمكنك العمل. هذه هي الطريقة التي كان يعمل بها جامعو البيانات المهملة :) في وقت لاحق، تم تغيير هذه الآلية، والآن يعمل جامع البيانات المهملة في الخلفية، دون إبطاء عمل البرنامج نفسه. أنت تعلم بالفعل أن الكائن يموت عندما لا تكون هناك أي مراجع متبقية له. لكن جامع البيانات المهملة لا يحسب فعليًا المراجع إلى . أولا، يمكن أن تكون طويلة جدا. ثانيا، أنها ليست فعالة جدا. بعد كل شيء، يمكن للأشياء الرجوع إلى بعضها البعض! المزيد عن جامع القمامة - 2يوضح الشكل مثالاً حيث تشير 3 كائنات إلى بعضها البعض، ولكن لا يشير إليها أي شخص آخر. أي أنها ليست ضرورية حتى يعمل باقي البرنامج. إذا كان جامع البيانات المهملة يقوم ببساطة بإحصاء المراجع، فستبقى كل هذه الكائنات الثلاثة ولن تحرر الذاكرة: هناك مراجع لها! ويمكن مقارنتها بسفينة فضائية. أثناء الرحلة، قرر رواد الفضاء التحقق من قائمة قطع الغيار للإصلاح، ووجدوا بينهم عجلة قيادة ودواسات من سيارة عادية. من الواضح أنه ليست هناك حاجة إليها هنا وتشغل مساحة إضافية. على الرغم من أن هذه الأجزاء متصلة ولها بعض الوظائف، إلا أنها في إطار عمل المركبة الفضائية تعتبر قمامة غير ضرورية، ومن الأفضل التخلص منها. لذلك، قررت Java أن تجعل الأساس لجمع البيانات المهملة لا يعتمد على المراجع، بل يقسم الكائنات إلى نوعين - يمكن الوصول إليه وغير قابل للوصول. كيفية تحديد ما إذا كان يمكن الوصول إلى كائن؟ كل شيء عبقري بسيط. يكون الكائن قابلاً للوصول إذا تمت الإشارة إليه بواسطة كائن آخر يمكن الوصول إليه. وينتج عن هذا "سلسلة إمكانية الوصول". يبدأ عندما يبدأ البرنامج ويستمر طوال مدة تشغيله. يبدو الأمر كما يلي: المزيد عن جامع القمامة - 4يشير السهم الموجود في الشكل إلى الكود التنفيذي لبرنامجنا. في التعليمات البرمجية، على سبيل المثال في الطريقة main()، يتم إنشاء مراجع للكائنات. يمكن أن تشير هذه الكائنات إلى كائنات جديدة، وتلك إلى كائنات أخرى، وهكذا. يتم تشكيل سلسلة من روابط الكائنات . إذا كان من الممكن الوصول إلى كائن من خلال سلسلة الارتباطات هذه إلى "الرابط الجذري"، أي الرابط الذي تم إنشاؤه مباشرة في التعليمات البرمجية المنفذة، فإنه يعتبر قابلاً للوصول. في صورتنا يشار إليها باللون الأزرق. ولكن إذا سقط كائن ما من هذه السلسلة، أي أن أيا من المتغيرات في الكود الذي يتم تنفيذه حاليا لا يحتوي على إشارات إليه، كما أنه من المستحيل الوصول إليه من خلال "سلسلة الروابط" - فهو يعتبر غير قابل للوصول. في برنامجنا، يتم الإشارة إلى كائنين من هذا القبيل باللون الأحمر. يرجى ملاحظة: هذه الكائنات "الحمراء" لها روابط مع بعضها البعض. ولكن، كما قلنا سابقًا، لا يقوم جامع البيانات المهملة الحديث في Java بالعد المرجعي. فهو يحدد ما إذا كان الكائن يمكن الوصول إليه أم لا . ولذلك فإن الجسمين الأحمرين الموجودين في الصورة سيصبحان فريسته. الآن دعونا نلقي نظرة على العملية برمتها من البداية إلى النهاية، وفي نفس الوقت دعونا نرى كيف تعمل الذاكرة في Java :) يتم تخزين جميع الكائنات في Java في منطقة ذاكرة خاصة تسمى الكومة . في اللغة العادية، "الكومة" هي جبل من الأشياء حيث كل شيء يتناثر في خليط. لكن الكومة في Java ليست كذلك. لديها بنية منطقية ومعقولة للغاية. في أحد الأيام، اكتشف مبرمجو Java أن جميع الكائنات الموجودة في برامجهم يمكن تقسيمها إلى نوعين - كائنات بسيطة نسبيًا وكائنات "طويلة العمر" . الكائنات "طويلة العمر" هي تلك التي نجت من العديد من مجموعات القمامة. في أغلب الأحيان سوف تكون موجودة حتى نهاية البرنامج. ونتيجة لذلك، تم تقسيم الكومة المشتركة، حيث يتم تخزين جميع الكائنات التي تم إنشاؤها، إلى عدة أجزاء. الجزء الأول له اسم جميل - عدن ("جنة عدن" التوراتية). هذا اسم رائع لأنه هذا هو المكان الذي تذهب إليه الكائنات بعد إنشائها. في هذا الجزء يتم تخصيص الذاكرة للأشياء الجديدة عندما نكتبnew. يمكن إنشاء العديد من الكائنات، وعندما تنفد المساحة في هذه المنطقة، تبدأ عملية جمع القمامة الأولى "السريعة". يجب أن يقال أن جامع البيانات المهملة ذكي للغاية ويختار خوارزمية العمل اعتمادًا على ما هو أكثر في الكومة - البيانات المهملة أو الكائنات العاملة. إذا كانت جميع الكائنات تقريبًا عبارة عن قمامة، يقوم المجمع بوضع علامة على الكائنات "الحية" ونقلها إلى منطقة ذاكرة أخرى، وبعد ذلك يتم تنظيف المنطقة الحالية بالكامل. إذا كانت القمامة قليلة وأغلبها مشغولة بالكائنات الحية، فإنها تحدد القمامة وتنظفها وترتب الأشياء المتبقية. قلنا "يحدد المجمع الأشياء "الحية" وينقلها إلى موقع آخر في الذاكرة"، ولكن أي موقع؟ منطقة الذاكرة حيث يتم نقل جميع الكائنات التي تبقى على قيد الحياة في مجموعة واحدة على الأقل من البيانات المهملة تسمى Survival Space . مساحة البقاء، بدورها، مقسمة إلى أجيال . يتم تعيين جيل لكل كائن بناءً على عدد مجموعات البيانات المهملة التي مر بها. إذا كان هناك واحد، فهو ينتمي إلى "الجيل 1"، وإذا كان 5 - إلى "الجيل 5". تشكل Eden وSurvival Space معًا منطقة تسمى Young Generation . بالإضافة إلى الجيل الشاب، هناك منطقة ذاكرة أخرى في الكومة - الجيل القديم ("الجيل القديم"). هذه هي الكائنات طويلة العمر والتي نجت من العديد من مجموعات القمامة. من المربح أكثر تخزينها بشكل منفصل عن الآخرين. وفقط عندما تكون منطقة الجيل القديم ممتلئة، أي. حتى أن هناك العديد من الكائنات طويلة العمر في البرنامج بحيث لا توجد ذاكرة كافية، يتم إجراء مجموعة كاملة من البيانات المهملة. فهو لا يعالج منطقة ذاكرة واحدة فحسب، بل يعالج عمومًا جميع الكائنات التي تم إنشاؤها بواسطة جهاز Java. وبطبيعة الحال، يستغرق الأمر المزيد من الوقت والموارد. ولهذا السبب تقرر تخزين الأشياء طويلة العمر بشكل منفصل. وعندما تنفد المساحة في مناطق أخرى، يتم تنفيذ ما يسمى بـ “الجمع السريع للقمامة”. وهو يغطي منطقة واحدة فقط، ونتيجة لذلك فهو أكثر اقتصادا وأسرع. في النهاية، عندما تكون المنطقة المخصصة للمعمرين مسدودة بالفعل، يدخل التنظيف الكامل في المعركة. وبالتالي، يتم استخدام الأداة الأكثر "ثقيلة" من قبل المجمع فقط عندما لم تعد هناك حاجة إليها. من الناحية التخطيطية، يبدو هيكل الكومة والتنظيف كما يلي: المزيد عن جامع القمامة - 5
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION