تتم إدارة تخصيص الذاكرة وإصدارها في Java و C# تلقائيًا بواسطة الأجهزة الظاهرية. لقد قمت سابقًا بتقديم طريقة إعادة تدوير كائن GC في CLR ، وهي استراتيجية لإعادة تدوير الذاكرة القائمة على الأجيال. في الواقع ، في Java ، تستند استراتيجية إعادة تدوير كائن JVM أيضًا إلى فكرة تقسيم الأجيال. الغرض من ذلك هو زيادة القمامة
يتجنب أداء إعادة التدوير التأخير في استجابة البرنامج الناتجة عن التحقق من جميع الكائنات في الكومة ، لأنه عندما ينفذ JVM GC ، فإنه يتوقف عن الكلمة ، أي أنه ينهي تشغيل مؤشرات الترابط الأخرى ، ويعيد فقط عمليات مؤشرات الترابط الأخرى بعد اكتمال إعادة التدوير. الفكرة القائمة على تقسيم الأجيال هي: JVM يحتاج فقط إلى جزء صغير من الذاكرة في كل مرة ينفذ فيها جامع القمامة.
يتم التحقق من مراجع الكائنات ، وهذا العدد الصغير من الكائنات له دورة حياة أقصر ، مما يزيد من أداء جمع القمامة. أدناه سنقدم الاستراتيجيات الأساسية لخوارزميات استرداد الذاكرة القائمة على الأولي في جافا في المستقبل:
1. توليد تقسيم ذاكرة كومة JVM
في استراتيجية استعادة الذاكرة المستندة إلى الأجيال ، عادة ما تنقسم مساحة الكومة إلى 3 أجيال ، جيل شاب ، جيل قديم (أو جيل مستقل) ، وجيل دائم. من بين الجيل الشاب ، هناك ثلاث مناطق صغيرة: عدن ، S0 ، و S1 ، كما هو موضح في الشكل أدناه:
من بينها ، يتم دائمًا تعيين الكائنات الجديدة في جيل العمر. عندما يتم ملء مساحة الجيل الشاب ، يجب تنفيذ مجموعة القمامة ، أي يتم تنفيذ GC البسيطة ، لإعادة تدوير الكائنات التي لم تعد مُشار إليها ، وفي الوقت نفسه يزيد من عمر الأشياء الباقية. الأشياء الباقية في جيل العمر لها مجال تعريف العمر. بمجرد وصولهم إلى عتبة معينة ، سيتم ترقية الأشياء التي لا تزال قائمة إلى مساحة الجيل القديم.
يتم استخدام مساحة الجيل القديم لتخزين الأشياء التي نجت لفترة طويلة ، أي كائنات ذات دورة حياة طويلة. بمجرد أن تصل الأشياء الباقية في مساحة الجيل الشاب إلى عتبة معينة ، سيتم ترقيتها تلقائيًا إلى الجيل القديم. عندما تمتلئ مساحة الجيل القديم بالأشياء ، سيتم تنفيذ GC الرئيسية مرة واحدة. بالمقارنة مع GC الصغرى ، فإن عدد عمليات الإعدام في GC الرئيسية أقل بكثير من عدد GC الصغرى. في الوقت نفسه ، تنفذ GC Major أطول من GC الصغرى. لأنه ينطوي على مزيد من المسح الكائن. تعتمد فكرة الأجيال هذه أيضًا على الخيار الأفضل في الممارسة العملية التي تتمتع بها الأشياء المخصصة حديثًا في دورة حياة أقصر والأشياء المسنين لها دورة حياة أطول.
في الوقت نفسه ، عندما يقوم GC Minor GC و Major GC بإجراء مجموعة Garbage ، فإنهم يتوقفون عن الحدث العالمي ، أي إنهاء مؤشرات الترابط الجري واستعادة جميع الخيوط عند تنفيذ GC.
بالنسبة لذاكرة التوليد الدائم ، يتم استخدامه بشكل أساسي لتخزين المعلومات ذات الصلة بالبيانات الوصفية ومعلومات الفصول والأساليب. عندما لم يعد الفصل قيد الاستخدام ، سيتم إعادة تدويره. عند تنفيذ GC الكامل ، سيتم مسح ذاكرة الجيل الدائم لجمع القمامة.
2. عملية معالجة جمع القمامة القائمة على الأولي
أولاً ، في البداية ، يتم تعيين الكائن الجديد إلى منطقة عدن ، S0 و S1 فارغين. عندما يتم ملء المساحة في عدن ، قم بإجراء GC Minor مرة واحدة. سيقوم جامع القمامة بنقل الكائن المشار إليه إلى منطقة S0 ، وسيتم حذف الكائنات التي لم يعد يتم الرجوع إليها. في الوقت نفسه ، يكون عمر الكائن الباقي على قيد الحياة هو 1. بعد تحديد GC ، تكون مناطق Eden و S1 فارغة كما هو موضح في الشكل أدناه.
في المرة التالية التي يتم فيها تنفيذ GC الصغرى ، مثل خطوات التنفيذ السابقة ، فإن الفرق الوحيد هو أن الكائن المشار إليه ، أي الكائن الباقي على قيد الحياة ، سيتم نقله إلى منطقة S1 ، وسيزداد عمر الكائن الباقي في منطقة S0 بمقدار 1 ويصبح 2 ، كما هو موضح في الشكل أدناه.
عندما يتم تنفيذ GC الصغرى مرة أخرى ، سيتم نقل الكائن الباقي إلى منطقة S0 وإضافة 1 إلى عمر الكائن الباقي على قيد الحياة كما هو موضح في الشكل أدناه
عندما يتم تنفيذ GC الصغرى أخيرًا ، وجد أن الكائن الباقي في S1 يصل إلى 8 (على افتراض أن العتبة تم تعيينها على 8) ، وسيتم تعزيز الكائن إلى ذاكرة الشيخوخة القديمة ، كما هو موضح في الشكل أدناه.
ض
عندما تمتلئ مساحة الكومة القديمة بالكائنات ، سيتم تنفيذ GC الرئيسية مرة واحدة ، مما سيؤدي إلى مسح الكائنات بأن الكومة القديمة لم يعد يتم الرجوع إليها ، وفي الوقت نفسه ، ضغط المساحة. كما هو مبين في الشكل أدناه.
مناقشة موجزة أعلاه حول استراتيجية إعادة تدوير القمامة في JVM هي كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.