إدارة الذاكرة التلقائية

‏‫إدارة الذاكرة التلقائية هي واحدة من الخدمات التي يقدمها وقت تشغيل اللغة العامة أثناء التنفيذ المُدَار. جامع البيانات المهملة في وقت تشغيل اللغة العامة يدير تخصيص و تحرير الذاكرة لتطبيق. بالنسبة للمطورين, هذا يعني أنه لا يجب عليك كتابة تعليمات برمجية لتنفيذ مهام إدارة الذاكرة عندما تطور تطبيقات مُدارة. إدارة الذاكرة التلقائية يمكنها التخلص من المشاكل الشائعة , مثل نسيان مسح كائن و التسبب في تسرب الذاكرة , أو محاولة الوصول إلى الذاكرة للحصول على كائن تم بالفعل مسحه. يصف هذ المقطع كيف يخصص جامع البيانات المهملة الذاكرة و يحررها .

تخصيص الذاكرة

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

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

تحرير الذاكرة

مشغّل تحسين جامع البيانات المهملة يحدد أفضل وقت للقيام بالجمع بناءاً على عمليات التخصيص التي يتم إجراؤها. عندما يقوم جامع البيانات المهملة بالجمع ، فإنه يحرر الذاكرة للكائنات التي لم تعد مستخدمة بواسطة التطبيق. إنه يحدد أي كائنات لم تعد مستخدمة عن طريق فحص جذور التطبيق. كل تطبيق له مجموعة من الجذور. كل جذر إما أن يشير إلى كائن في كومة الذاكرة المؤقتة المُدارة أو يتم تعيينه إلى فارغ. تتضمن جذور التطبيق مؤشرات للكائنات العامة و الثابتة , و المتغيرات المحلية , و معلمات الكائن المرجعي في مكدس الدالة الخيطية , و سجلات الـ CPU. جامع البيانات المهملة لديه حق الوصول إلى قائمة الجذور النشطة التي يحافظ عليها برنامج التحويل البرمجي في الوقت المناسب (JIT) و وقت التشغيل. باستخدام هذه القائمة ، يفحص جذور أحد التطبيقات , و في العملية ينشئ رسم بياني يحتوي على كافة الكائنات التي يمكن الوصول إليها من الجذور.

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

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

الأجيال و الأداء

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

يخزن حاوي المهملات في وقت التشغيل جديد الكائنات في توليد 0. تتم ترقية الكائنات التي يتم إنشاؤها في بداية عمر تطبيق survive مجموعات وتخزينها في generations 1 و 2. عملية ترقية الكائن هو الموضحة فيما بعد في ترتيب هو الموضوع. نظرًا لأن ضغط جزء من كومة الذاكرة المؤقتة المُدارة أسرع من ضغط كومة الذاكرة المؤقتة المُدارة بأكملها , هذا النظام يسمح لجامع البيانات المهملة بتحرير الذاكرة في أجيال معينة بدلاً من تحرير الذاكرة في كومة الذاكرة المؤقتة المُدارة بأكملها في كل مرة يقوم فيها بالجمع.

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

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

بعد أن ينفذ حاوي المهملات به مجموعة أول من الجيل 0 و ترقية الكائنات قابلة للوصول إلى توليد 1، فإنه يعتبر الجزء المتبقي إنشاء كومة ذاكرة مؤقتة التي تمت إدارتها 0. يستمر إلى يخصص ذاكرة للكائنات الجديدة في توليد 0 حتى الجيل 0 ممتلئ وعند الضرورة إلى تنفيذ مجموعة أخرى. عند هذه النقطة، يحدد مشغل تحسين جامع البيانات المهملة ما إذا كان من الضروري فحص الكائنات في الأجيال الأقدم. على سبيل المثال، إذا كانت مجموعة من الجيل 0 عدم استعادة ذاكرة كافية للتطبيق إلى بنجاح إكمال محاولة به إلى إنشاء كائن جديد، collecإلىr البيانات المهملة تنفيذ مجموعة من الجيل 1، ثم إنشاء 2. إذا لا هذا باستعادة ذاكرة كافية، حاوي المهملات تنفيذ مجموعة من generations 0 و 1 و 2. بعد كل مجموعة، collecإلىr البيانات المهملة ضغط الكائنات قابلة للوصول في توليد 0 وترقية لها إلى الجيل 1. يتم ترقية الكائنات في توليد 1 survive مجموعات إلى الجيل 2. نظراً لأن collecإلىr البيانات المهملة يعتمد generations ثلاثة فقط، تظل الكائنات في توليد 2 survive مجموعة في توليد 2 حتى يتم تحديد أنها إلى تكون غير قابلة للوصول في مجموعة مستقبلية.

تحرير الذاكرة للموارد غير المُدارة

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

راجع أيضًا:

المرجع

GC

المبادئ

عملية تنفيذ مُدارة

موارد أخرى

تجميع البيانات المهملة