تكرار السؤال: …
الإجابة المختصرة
تحدد الراية الحد الأقصى لذاكرة الـ Heap بالميجابايت قبل إطلاق الـ Out of Memory، ويلزم تعديلها عند معالجة بيانات ضخمة مع مراعاة حدود حاوية Docker.
الشرح
افتراضياً، تحدد Node.js حداً أقصى للذاكرة بناءً على حجم الرام المتوفر للنظام (غالباً بين 2GB إلى 4GB على أنظمة 64-bit). في بيئات الحاويات، إذا تم تعيين max-old-space-size بقيمة تفوق حد ذاكرة الحاوية (Container Memory Limit)، سيقوم نظام التشغيل (OOM Killer) بإنهاء الحاوية قسرياً دون أن يحصل V8 على فرصة لتنظيف الذاكرة.
مثال بالكود
import v8 from "node:v8";
const limitMb = v8.getHeapStatistics().heap_size_limit / 1024 / 1024;
console.log(`heap limit: ${limitMb.toFixed(0)} MB`);
// Start the process with a bigger old-space limit:
// node --max-old-space-size=4096 app.js
// In a container, stay below the memory limit (≈75%), e.g. a 2 GB container:
// ENV NODE_OPTIONS="--max-old-space-size=1536"أخطاء شائعة
- تعيين الحد بقيمة مساوية لذاكرة الحاوية تماماً مع نسيان استهلاك الذاكرة خارج الـ Heap (مثل Buffers وخيوط الـ C++).