هناك أربع خوارزميات شائعة لجمع القمامة في JVM:
خوارزمية تحطيم العلامات (Mark-Sweep) ؛
خوارزمية نسخ (نسخ) ؛
مارك
مجموعة الأجيال
دعونا نقدمها واحدة تلو الأخرى:
1. خوارزمية تحطيم علامة
هذه هي خوارزمية مجموعة القمامة الأساسية. تنقسم الخوارزمية إلى مرحلتين: "وضع العلامات" و "المقاصة": أولاً ، يتم تمييز جميع الكائنات التي تحتاج إلى إعادة تدويرها ، ويتم إعادة تدوير جميع الكائنات المحددة بشكل موحد بعد اكتمال العلامة. عيوبها الرئيسية اثنان: أحدهما مشكلة الكفاءة ، وكفاءة العلامات والتنظيف ليست عالية ؛ والآخر هو مشكلة الفضاء ، بعد تطهير العلامات ، سيتم إنشاء عدد كبير من شظايا الذاكرة غير المستمرة. قد يسبب الكثير من شظايا الفضاء مساحة مستمرة كبيرة غير كافية عند تخصيص الأشياء الكبيرة ، ويجب تشغيل إجراء آخر لجمع القمامة مسبقًا.
رسم خوارزمية مارك واضحة
2. خوارزمية نسخ (نسخ)
من أجل حل مشكلة الكفاءة ، مع خوارزمية "النسخ" ، فإنها تقسم الذاكرة المتاحة إلى كتلتين من نفس الحجم. استخدم قطعة واحدة فقط في وقت واحد. عند استخدام قطعة واحدة من المساحة ، انسخ الكائن الذي لا يزال محقًا إلى قطعة أخرى ، ثم قم بتنظيف مساحة الذاكرة المستخدمة حديثًا في وقت واحد. هذا يجعل من الممكن إعادة تدوير إحدى القطع في كل مرة ، بحيث لا يلزم تجزئة الذاكرة وغيرها من المواقف المعقدة للنظر عند تخصيص الذاكرة. التنفيذ البسيط والتشغيل الفعال. لكن تكلفة هذه الخوارزمية هي تقليل الذاكرة إلى نصف الأصل ، وهو مكلف بعض الشيء. في الواقع ، فإن 98 ٪ من الكائنات في الجيل الجديد تعيش ويموت ، لذلك ليست هناك حاجة لتقسيم الذاكرة بنسبة 1: 1 ، ولكن تقسيم الذاكرة إلى مساحة أكبر عدن ومساحتين أصغر من الناجين ، في كل مرة تستخدم مساحة عدن وأحد مساحات الناجين. عند إعادة تدويرها ، انسخ الأشياء التي لا تزال محققة في عدن والناجين إلى Suivivor آخر في وقت واحد ، وأخيراً تنظيف مساحة عدن والناجين المستخدم حديثًا.
نسخ مخطط الخوارزمية
3. مارك كومباكت
عندما يكون معدل بقاء الكائن مرتفعًا ، يجب أن تؤدي خوارزمية النسخ المتماثل والتجميع إلى إجراء المزيد من عمليات النسخ المتماثل ، وستصبح الكفاءة أقل. والأهم من ذلك ، إذا كنت لا ترغب في إهدار 50 ٪ من المساحة ، فيجب أن يكون لديك مساحة إضافية لتخصيص ضمانات للتعامل مع الوضع القصير حيث تكون جميع الكائنات في ذاكرة نصف المنطقة حية بنسبة 100 ٪ ، لذلك لا يمكن استخدام هذه الخوارزمية مباشرة في كبار السن.
لذلك ، اقترح الناس خوارزمية أخرى "مارك مركبة". نظرًا لأن الكائنات في كبار السن لها دورة على قيد الحياة طويلة ، فقد اقترح بعض الأشخاص خوارزمية "Mark-Compact". عملية وضع العلامات هي نفسها "تنظيف العلامات" ، ولكن أثناء تطهير الأشياء الميتة ، سيتم فرز الأشياء الباقية ، والتي يمكن أن تقلل من المساحة المجزأة.
تخطيط خوارزمية تنظيم العلامات
4. مجموعة الأجيال
حاليًا ، تعتمد مجموعة القمامة للأجهزة الافتراضية التجارية خوارزمية "مجموعة الأجيال". لا توجد فكرة جديدة في هذه الخوارزمية ، لكن الذاكرة مقسمة إلى عدة قطع وفقًا لدورات البقاء المختلفة للكائن. بشكل عام ، تنقسم أكوام Java إلى الجيل الجديد والجيل القديم ، بحيث يمكن استخدام خوارزمية التجميع الأنسب وفقًا لخصائص كل جيل. في الجيل الجديد ، في كل مرة يتم فيها جمع مجموعة القمامة ، يتم العثور على عدد كبير من الأشياء ميتة وفقط عدد قليل من البقاء على قيد الحياة. ثم استخدم خوارزمية النسخ ، ويمكن إكمال المجموعة بمبلغ صغير من تكلفة النسخ. في كبار السن ، نظرًا لأن معدل البقاء على قيد الحياة للكائنات مرتفع والدورة طويلة ، يتم استخدام خوارزمية "mark-tidy" أو "mark-clear" لإعادة تدويرها.
المقدمة أعلاه لخوارزميات جمع القمامة الشائعة في JVM هي كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.