تكرار السؤال: …
الإجابة المختصرة
تثبيت الكائن في موقع محدد بالـ RAM لمنع الـ GC من تحريكه أثناء تمريره لكود غير مدار (C/C++)؛ ومخاطره إعاقة ضغط الذاكرة وخلق تفتت حاد في الـ Heap.
الشرح
يقوم الـ GC عادة بضغط الذاكرة ونقل الكائنات لتوفير مساحات متصلة. إذا كنت تتعامل مع دالة C أصلية عبر P/Invoke تتوقع مؤشراً ثابتاً لعنوان الذاكرة، فإن عبارة fixed تضع علامة تثبيت (Pinning) على الكائن تمنع الـ GC من تحريكه طوال مدة الكتلة. الإفراط في تثبيت كائنات في Gen 0/1 يعيق حركة الـ GC ويجبره على القفز فوقها مسبباً تفتت الذاكرة.
مثال بالكود
unsafe {
byte[] buffer = new byte[100];
fixed (byte* p = buffer) {
// المؤشر p ثابت ولا يمكن للـ GC تحريكه هنا
NativeMethods.FillBuffer(p, 100);
}
}أخطاء شائعة
- تثبيت الكائنات لفترات طويلة جداً مما يمنع ضغط الـ Heap ويؤدي للـ Memory Fragmentation.
أسئلة متابعة
- كيف يعمل مجمع المهملات (Garbage Collector) في .NET وما هي الأجيال الثلاثة (Gen 0, Gen 1, Gen 2)؟
- ما هو الـ Large Object Heap (LOH) في .NET ولماذا يعد عرضة لتفتت الذاكرة (Memory Fragmentation)؟