تكرار السؤال: …
الإجابة المختصرة
يقسم الـ Heap إلى 3 أجيال بناءً على عمر الكائنات: Gen 0 للكائنات حديثة الإنشاء، Gen 1 كمنطقة وسيطة، وGen 2 للكائنات طويلة العمر، مما يسرع التنظيف ويركز على الأكثر موتاً.
الشرح
يعتمد الـ GC على فرضية أن معظم الكائنات تموت بعد وقت قصير جداً من إنشائها. يتم تخصيص الكائنات في Gen 0؛ وعند امتلائه، يُنفذ تنظيف سريع جداً لا يتطلب فحص كامل الذاكرة. الكائنات التي تنجو من التنظيف تُرقّى إلى Gen 1 ثم Gen 2. تنظيف Gen 2 يسمى Full GC وهو الأكثر استهلاكاً لوقت المعالج ويتطلب تجميد خيوط التطبيق في الأنماط غير المتزامنة.
مثال بالكود
Console.WriteLine("User gen: " + GC.GetGeneration(user));
Console.WriteLine("Total Memory: " + GC.GetTotalMemory(false));أخطاء شائعة
- استدعاء GC.Collect() يدوياً في الكود الإنتاجي مما يربك خوارزميات الـ CLR الذكية ويفسد توازن الأجيال.
أسئلة متابعة
- ما هو الـ Large Object Heap (LOH) في .NET ولماذا يعد عرضة لتفتت الذاكرة (Memory Fragmentation)؟
- ما هو تثبيت الذاكرة (Memory Pinning) وعبارة fixed وما مخاطرها على الـ Garbage Collector؟