تكرار السؤال: …
الإجابة المختصرة
منطقة مخصصة للكائنات التي تتجاوز 85,000 بايت (مثل المصفوفات الضخمة)؛ ولا يتم ضغطها افتراضياً لتوفير كلفة نقل البيانات الكبيرة، مما يخلق فجوات ذاكرة تؤدي للـ OOM.
الشرح
نظراً لأن نسخ كائنات الـ 85KB+ في الذاكرة أثناء الـ Garbage Collection يستهلك وقتاً ضخماً، كان الـ GC ينظفها دون ضغط (Compaction)، تاركاً فراغات بين المساحات المحررة. مع تكرار تخصيص وحذف مصفوفات ضخمة، تتفتت الذاكرة ويعجز السيرفر عن إيجاد مساحة متصلة لكائن جديد فينهار التطبيق بـ OutOfMemoryException. الحل هو استخدام ArrayPool<T> لإعادة تدوير المصفوفات الكبيرة.
مثال بالكود
// استخدام ArrayPool لتجنب تخصيص الـ LOH والتفتت
var pool = ArrayPool<byte>.Shared;
byte[] buffer = pool.Rent(100_000); // استعارة من الـ Pool
try {
// معالجة البيانات
} finally {
pool.Return(buffer); // إرجاع للـ Pool
}أخطاء شائعة
- حجز مصفوفات بايتات مؤقتة كبيرة في كل طلب معالجة ملفات بدلاً من استعارتها من ArrayPool.