كيفية إصلاح “خطأ نفاد ذاكرة JavaScript Heap”

تظل JavaScript واحدة من أكثر لغات البرمجة استخدامًا نظرًا لتعدد استخداماتها. لتشغيل JavaScript خارج بيئة المتصفح ، يجب على المطورين تثبيت Node.js ، وهي بيئة تشغيل متعددة الأنظمة الأساسية.

يعد خطأ نفاد الذاكرة في JavaScript أمرًا شائعًا عند تشغيل مشروع JavaScript Node.js.

مشكلة نفاد الذاكرة في JavaScript هي خطأ يحدث عندما تكون الذاكرة الافتراضية المخصصة من قبل نظام الكمبيوتر غير كافية لتشغيل مشروع كبير.

إذا واجهت خطأ نفاد الذاكرة ، فسوف يتعطل برنامجك ويعرض هذا الإخراج ؛

خطأ فادح: CALL_AND_RETRY_LAST فشل التخصيص – نفاد ذاكرة JavaScript

أو

خطأ فادح: فشل تخصيص حجم الجدول غير صالح – نفدت الذاكرة في كومة جافا سكريبت

أسباب كومة JavaScript نفاد خطأ في الذاكرة

  • وجود هياكل بيانات كبيرة: يمكن أن يستهلك العمل مع هياكل البيانات الكبيرة مثل المصفوفات أو المصفوفات مساحة كبيرة ، مما يؤدي في النهاية إلى نفاد الذاكرة.

هذا مثال على هيكل بيانات كبير يحتوي على مليار عنصر ؛

let array = [];

for (let i = 0; i < 1000000000; i++) {

  array.push(i);

}
  • ضعف إدارة الذاكرة: مع نمو تطبيقك ، تحتاج إلى التخلي عن بعض العناصر التي لم تعد بحاجة إليها.

هذا مثال على دالة تؤدي إلى حدوث تسرب للذاكرة ؛

let array = [];

setInterval(function() {

  array.push(new Array(1000000).join("x"));

}, 1000);
  • الحلقات اللانهائية: مثل هذا الرمز يعمل إلى الأبد حيث لا يتم الوصول إلى شرط الإنهاء.

هذا مثال على حلقة لا نهائية ستنفذ إلى الأبد ؛

while (true) {

    console.log(1);

}

يمكن أن تؤدي الحلقات اللانهائية إلى هذا الخطأ لأنها تستخدم الذاكرة بسرعة كبيرة.

  • الوظائف التكرارية: الوظيفة العودية هي وظيفة تستدعي نفسها بشكل غير مباشر أو مباشر لتكرار / مجموعة معينة من التعليمات (التعليمات) حتى يتم / يتم استيفاء شرط (شروط) معين. إذا كانت هذه الوظائف جيدة التصميم ، فمن المحتمل أن تؤدي إلى ذاكرة مسبقة ، وفي النهاية كومة من أخطاء الذاكرة.
  • وجود العديد من الكائنات في جزء من التعليمات البرمجية: إذا كانت التعليمات البرمجية الخاصة بك تحتوي على العديد من الكائنات الكبيرة ، فإن الذاكرة التي تستخدمها هذه الكائنات مجتمعة يمكن أن تؤدي إلى زيادة التحميل.
  لماذا لن تسمح لك GroupMe بتسجيل الدخول؟

إصلاح JS كومة من خطأ الذاكرة

يمكن أن يحدث هذا الخطأ في أنظمة التشغيل المستندة إلى Windows و macOS و Linux مثل Ubuntu. لحسن الحظ ، يمكن إصلاح الخطأ ، بغض النظر عن نظام التشغيل الخاص بك.

# 1. إصلاح خطأ نفاد الذاكرة في كومة JavaScript على نظام التشغيل Windows

الخطوة 1: انقر فوق قائمة ابدأ وحدد إعدادات النظام المتقدمة.

الخطوة 2: انقر فوق متغيرات البيئة في الجزء السفلي الأيسر من مربع الحوار.

الخطوة 3: انقر فوق “جديد” إما على متغيرات المستخدم أو متغيرات النظام. الخيار الأول يطبق التغييرات على حساب المستخدم الحالي. ومع ذلك ، فإن الخيار الثاني يطبق التغييرات على النظام بأكمله.

الخطوة 4: سيكون هناك خياران معروضان ؛ في اسم المتغير ، أدخل NODE_OPTIONS وفي قيمة المتغير ، أدخل –max-old-space-size = 4096. في هذه الخطوة ، سيخصص الرقم 4096 ذاكرة افتراضية بسعة 4 جيجا بايت لـ Node.js. يمكنك تخصيص المزيد مثل 8 غيغابايت ، عن طريق تعيين القيمة على حجم مساحة -max-old-space = 8192.

الخطوة 5: انقر فوق “موافق” ، وتطبيق وأخيراً ، “موافق” لحفظ التغييرات.

يمكنك أيضًا استخدام محطة Windows PowerShell لحل الخطأ. افتح Terminal على نظام التشغيل Windows الخاص بك وأدخل الأمر التالي ؛

env:NODE_OPTIONS="--max-old-space-size=4096"

يمكنك أيضًا حل الخطأ مؤقتًا عن طريق تشغيل هذا الأمر قبل تشغيل التطبيق الخاص بك ؛

set NODE_OPTIONS=--max-old-space-size=4096

# 2. إصلاح خطأ نفاد الذاكرة في كومة JavaScript على Linux

  • الخطوة الأولى: تحديد مصدر الخطأ. تحقق من سجلات وحدة التحكم أو الإخراج لتحديد سطور الكود / الملف المتسبب في الخطأ.
  • الخطوة 2: تصدير متغير بيئة يحدد الذاكرة الظاهرية التي خصصتها لـ Node.js. استخدم هذا الأمر ؛
export NODE_OPTIONS=--max-old-space-size=4096

ستخصص هذه الخطوات ذاكرة افتراضية بسعة 4 جيجا بايت لـ Node.js. إذا استمر الخطأ ، يمكنك زيادة حجم الذاكرة عن طريق مضاعفة حجم الذاكرة.

على سبيل المثال ، إذا كنت ترغب في تخصيص 8 جيجا بايت كذاكرة افتراضية ، يمكنك تشغيل هذا الأمر ؛

export NODE_OPTIONS=--max-old-space-size=8192

# 3. إصلاح خطأ نفاد الذاكرة في كومة JavaScript على macOS

يمكنك حل مشكلة نفاد الذاكرة في كومة JavaScript في نظام macOS باستخدام نهج مماثل كما هو الحال في Linux. اتبع هذه الخطوات ؛

  • الخطوة 1: تحديد مصدر الخطأ عن طريق التحقق من سجلات وحدة التحكم أو الإخراج لتحديد سطور الكود / الملف الذي يسبب الخطأ.
  • الخطوة 2: تصدير متغير بيئة يحدد الذاكرة الظاهرية التي خصصتها لـ Node.js. استخدم هذا الأمر ؛
export NODE_OPTIONS=--max-old-space-size=4096

ستخصص هذه الخطوات ذاكرة افتراضية بسعة 4 جيجا بايت لـ Node.js. إذا استمر الخطأ ، يمكنك زيادة حجم الذاكرة عن طريق مضاعفة حجم الذاكرة.

  كيفية الوصول إلى موقع Microsoft Teams SharePoint لفريق

على سبيل المثال ، إذا كنت ترغب في تخصيص 8 جيجا بايت كذاكرة افتراضية ، يمكنك تشغيل هذا الأمر ؛

export NODE_OPTIONS=--max-old-space-size=8192

زيادة الذاكرة أثناء تثبيت NPM

تتناسب الحلول التي قدمناها حتى الآن مع الأخطاء التي تحدث عند تشغيل تطبيق Node.js. ومع ذلك ، يمكنك تخصيص ذاكرة افتراضية لحل مشكلة نفاد الذاكرة أثناء تثبيت حزم JavaScript. استخدم هذا الأمر ؛

node --max-old-space-size=4096 (which npm) install

ملاحظة: يمكنك الاستمرار في زيادة تخصيص الذاكرة الافتراضية بمقدار 1 غيغابايت أو 2 غيغابايت أو 3 غيغابايت أو 4 غيغابايت. يجب تحديد حجم الذاكرة بالميغابايت. ومع ذلك ، لا تخصص ذاكرة الجهاز بالكامل إلى Node.js لأن هذا قد يتسبب في تعطل برنامجك. كممارسة جيدة ، إذا كان جهازك يحتوي على 16 جيجابايت ، فيمكنك تخصيص ما يصل إلى 8 جيجابايت لـ Node.js.

منع JavaScript من خطأ نفاد الذاكرة

لقد ناقشنا حتى الآن كيفية إصلاح خطأ نفاد الذاكرة في كومة JavaScript عند حدوثه. لحسن الحظ ، يمكنك أيضًا اتخاذ إجراءات لمنع حدوث هذا الخطأ أثناء تشغيل كود JavaScript. هذه بعض من أفضل الطرق:

# 1. قسّم البيانات إلى أجزاء صغيرة

قد يكون لديك برنامج Node.js يقوم باستيراد مجموعات بيانات كبيرة من ملفات CSV كبيرة من خلال ETL: عملية الاستخراج – التحويل – التحميل. قد تجد أن تطبيقك يتعطل دائمًا عند محاولة استيراد البيانات. إذا كنت تعمل مع MongoDB ، فيمكنك حل الخطأ من خلال وجود تعليمات سطر أوامر مثل ؛

split -l 1000000 users.csv

يوجه هذا الأمر Node.js لتقسيم ملف باسم مستخدمين إلى عدة ملفات لكل منها 1000000 مستخدم. تحدد العلامة -l أنه يجب تقسيم الملف بناءً على عدد سطور التعليمات البرمجية.

# 2. مراقبة استخدام الذاكرة

يمكنك استخدام ملف تعريف الذاكرة لاكتشاف تسرب الذاكرة في التعليمات البرمجية الخاصة بك. يمكنك الجمع بين ذاكرة Node.js المدمجة و ChromeDevTools لتحقيق ذلك. يمكن للاثنين اكتشاف المشكلات في التعليمات البرمجية الخاصة بك وإصلاحها.

يمكنك أيضًا استخدام أدوات خارجية مثل Datadog و New Relic و AppDynamics لمراقبة أداء تطبيقك واتخاذ الإجراءات اللازمة. يمكنك أيضًا التحقق من استخدام الذاكرة على تطبيق Node.js من خلال طريقة process.memoryUsage ().

  كيفية إنهاء التطبيقات على iPhone X

# 3. تجنب تسرب الذاكرة

تحدث تسربات الذاكرة عندما يحتفظ تطبيق Node.js الخاص بك بالإشارات إلى الكائنات التي لم يعد بحاجة إليها. إذا لم يتم تجميع مثل هذه الكائنات ، فسيكون هناك تراكم لاستخدام الذاكرة بمرور الوقت.

هناك عدة طرق لتجنب تسرب الذاكرة ، مثل تجنب المتغيرات العامة في التعليمات البرمجية الخاصة بك ، وتجنب حظر عمليات الإدخال / الإخراج ، واستخدام الكلمات الأساسية let and const عند التصريح عن المتغيرات بدلاً من var.

# 4. عمليات التفريخ

إذا كنت تقوم بتشغيل Node.js على جهاز ذا ذاكرة محدودة ، مثل Raspberry Pi ، فمن المحتمل أن تواجه كومة من أخطاء الذاكرة. يمكن أن يكون لديك عملية رئيسية واحدة ، ويتم تجميع الآخرين كعاملين. بمجرد أن تكتشف العملية الرئيسية أن النظام ينفد من الذاكرة ، فإنها ستقتل هذه العملية وتعين المهمة إلى مهمة أخرى غير محملة بشكل زائد.

# 5. تحديث الأجهزة

إذا كانت زيادة تخصيص الذاكرة وتنفيذ العمليات المذكورة لمنع الكومة من أخطاء الذاكرة لا تحل مشاكلك ، فقد تفكر في تحديث أجهزتك. يمكن تشغيل Node.js على ذاكرة وصول عشوائي منخفضة تصل إلى 512 ميجابايت. ومع ذلك ، سيطلب تطبيقك المزيد من ذاكرة الوصول العشوائي مع نموه.

من ناحية أخرى ، يمكن أن تؤدي زيادة عدد وحدات المعالجة المركزية أيضًا إلى تحسين تخصيص الذاكرة. من الناحية المثالية ، ستسمح وحدتا CPU أو أكثر للتطبيق الخاص بك باستخدام مؤشرات ترابط العاملين في المهام التي تتطلب الكثير من وحدة المعالجة المركزية مثل التشفير ومعالجة الصور.

أسئلة وأجوبة

ما الذي يسبب خطأ نفاد الذاكرة في JavaScript Heap؟

يمكن أن يكون سبب هذا الخطأ عدة أسباب ؛
1. تسرب الذاكرة
2. حلقات لانهائية
3. وجود العديد من الأشياء في المشروع
4. وجود هياكل بيانات كبيرة

هل أخطاء JavaScript Heap Out of Memory قابلة للحل؟

نعم. يمكنك حل الخطأ من خلال ؛
1. تخصيص المزيد من الذاكرة الظاهرية لـ Node.js
2. القضاء على تسرب الذاكرة
3. تحسين التعليمات البرمجية الخاصة بك
4. ترقية أجهزتك

كيف يمكنك حل خطأ Heap Out of Memory في تطبيق React؟

React هي واحدة من أكثر مكتبات JavaScript شيوعًا. حدد موقع ملف package.json في الدليل الجذر وهذه الأسطر إلى قسم البرامج النصية ؛

"scripts": {

    "start": "react-scripts --max_old_space_size=4096 start",

    "build": "react-scripts --max_old_space_size=4096 build",

    "test": "react-scripts test",

    "eject": "react-scripts eject"

}

تغليف

معظم المطورين معتادون على الأخطاء البرمجية وأخطاء التعليمات البرمجية ، وليس أخطاء وقت التشغيل ، حيث يقومون بتشغيل برامج Node.js الخاصة بهم. لحسن الحظ ، لا داعي للقلق ، لأن كومة أخطاء الذاكرة قابلة للإصلاح. لقد حددنا ما هي كومة JavaScript من أخطاء الذاكرة ، وشرحنا كيفية حلها ، وكيفية تجنبها في مشروعك التالي Node.js.

بعد ذلك ، يمكنك أيضًا قراءة كيفية تجنب بعض أخطاء JavaScript الشائعة.