Comment réparer « Erreur de tas de mémoire JavaScript insuffisante »

JavaScript reste l’un des langages de programmation les plus utilisés en raison de sa polyvalence. Pour exécuter JavaScript en dehors d’un environnement de navigateur, les développeurs doivent installer Node.js, un environnement d’exécution multiplateforme.

L’erreur JavaScript heap out of memory est courante lors de l’exécution d’un projet JavaScript Node.js.

Le problème de tas de mémoire JavaScript insuffisant est une erreur qui se produit lorsque la mémoire par défaut allouée par le système informatique est insuffisante pour exécuter un gros projet.

Si vous rencontrez l’erreur Heap Out of Memory, votre programme plantera et affichera cette sortie.

ERREUR FATALE : CALL_AND_RETRY_LAST Échec de l’allocation – Tas JavaScript insuffisant en mémoire

Ou

Erreur fatale : échec de l’allocation de taille de table non valide – tas javascript à court de mémoire

Causes de l’erreur de mémoire insuffisante du tas JavaScript

  • Présence de grandes structures de données : travailler avec de grandes structures de données telles que des matrices ou des tableaux peut consommer beaucoup d’espace, provoquant éventuellement une erreur de mémoire insuffisante.

Ceci est un exemple d’une grande structure de données avec un milliard d’éléments ;

let array = [];

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

  array.push(i);

}
  • Mauvaise gestion de la mémoire : au fur et à mesure que votre application grandit, vous devez abandonner certains des objets dont vous n’avez plus besoin.

Voici un exemple de fonction qui entraîne une fuite de mémoire ;

let array = [];

setInterval(function() {

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

}, 1000);
  • Boucles infinies : un tel code s’exécute indéfiniment car une condition de terminaison n’est jamais atteinte.

Ceci est un exemple de boucle infinie qui s’exécutera indéfiniment ;

while (true) {

    console.log(1);

}

Des boucles infinies peuvent entraîner cette erreur car elles utilisent la mémoire assez rapidement.

  • Fonctions récursives : une fonction récursive est une fonction qui s’appelle elle-même indirectement ou directement pour répéter un/certain ensemble d’instructions jusqu’à ce qu’une ou plusieurs conditions soient remplies. Si ces fonctions sont bien conçues, elles entraîneront probablement une perte de mémoire et, éventuellement, un tas d’erreurs de mémoire.
  • Présence de nombreux objets dans un morceau de code : si votre code contient de nombreux objets volumineux, la mémoire utilisée collectivement par ces objets peut entraîner une surcharge.

Correction d’une erreur de tas JS hors mémoire

Cette erreur peut se produire dans les systèmes d’exploitation Windows, macOS et Linux comme Ubuntu. Heureusement, l’erreur peut être corrigée, quel que soit votre système d’exploitation.

#1. Correction de l’erreur JavaScript de mémoire insuffisante sur le système d’exploitation Windows

Étape 1 : Cliquez sur le menu Démarrer et recherchez Paramètres système avancés.

Étape 2 : Cliquez sur les variables d’environnement dans la partie inférieure gauche de la boîte de dialogue.

Étape 3 : Cliquez sur Nouveau sur Variables utilisateur ou Variables système. La première option applique les modifications au compte d’utilisateur actuel. Cependant, la deuxième option applique les modifications à l’ensemble du système.

Étape 4 : Il y aura deux options affichées ; sur le nom de la variable, entrez NODE_OPTIONS et sur la valeur de la variable, entrez –max-old-space-size=4096. Dans cette étape, le chiffre 4096 allouera 4 Go de mémoire virtuelle à Node.js. Vous pouvez en allouer davantage, par exemple 8 Go, en définissant la valeur sur –max-old-space-size=8192.

Étape 5 : Cliquez sur ok, appliquer et enfin sur ok pour enregistrer les modifications.

Vous pouvez également utiliser le terminal Windows PowerShell pour résoudre l’erreur. Ouvrez le terminal sur votre système d’exploitation Windows et entrez la commande suivante ;

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

Vous pouvez également résoudre temporairement l’erreur en exécutant cette commande avant d’exécuter votre application ;

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

#2. Correction de l’erreur de mémoire insuffisante du tas JavaScript sous Linux

  • Étape 1 : Identifiez la source de l’erreur. Vérifiez les journaux ou la sortie de la console pour déterminer les lignes de code/fichier à l’origine de l’erreur.
  • Étape 2 : Exportez une variable d’environnement en spécifiant la mémoire virtuelle que vous avez allouée à Node.js. Utilisez cette commande ;
export NODE_OPTIONS=--max-old-space-size=4096

Ces étapes alloueront 4 Go de mémoire virtuelle à Node.js. Si l’erreur persiste, vous pouvez augmenter la taille de la mémoire en doublant.

Par exemple, si vous souhaitez allouer 8 Go comme mémoire virtuelle, vous pouvez exécuter cette commande ;

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

#3. Correction de l’erreur de mémoire insuffisante du tas JavaScript sur macOS

Vous pouvez résoudre l’erreur de mémoire insuffisante du tas JavaScript dans macOS en utilisant une approche similaire à celle de Linux. Suivez ces étapes;

  • Étape 1 : Identifiez la source de l’erreur en consultant les journaux ou la sortie de la console pour déterminer les lignes de code/fichier à l’origine de l’erreur.
  • Étape 2 : Exportez une variable d’environnement spécifiant la mémoire virtuelle que vous avez allouée à Node.js. Utilisez cette commande ;
export NODE_OPTIONS=--max-old-space-size=4096

Ces étapes alloueront 4 Go de mémoire virtuelle à Node.js. Si l’erreur persiste, vous pouvez augmenter la taille de la mémoire en doublant.

Par exemple, si vous souhaitez allouer 8 Go comme mémoire virtuelle, vous pouvez exécuter cette commande ;

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

Augmenter la mémoire pendant l’installation de NPM

Les solutions que nous avons proposées jusqu’à présent conviennent aux erreurs qui se produisent lorsque vous exécutez une application Node.js. Cependant, vous pouvez allouer de la mémoire virtuelle pour résoudre l’erreur de mémoire insuffisante lorsque vous installez des packages JavaScript. Utilisez cette commande ;

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

Remarque : Vous pouvez continuer à augmenter l’allocation de mémoire virtuelle de 1 Go, 2 Go, 3 Go ou 4 Go. Vous devez spécifier la taille de la mémoire en Mo. Cependant, n’allouez pas toute la mémoire de la machine au Node.js car cela pourrait faire planter votre programme. En règle générale, si votre machine dispose de 16 Go, vous pouvez allouer jusqu’à 8 Go à Node.js.

Empêcher JavaScript l’erreur de tas hors mémoire

Jusqu’à présent, nous avons expliqué comment corriger l’erreur de manque de mémoire du tas JavaScript lorsqu’elle se produit. Heureusement, vous pouvez également prendre des mesures pour éviter que cette erreur ne se produise lorsque vous exécutez du code JavaScript. Voici quelques-unes des meilleures approches :

#1. Fractionner les données en petits morceaux

Vous pouvez avoir un programme Node.js qui importe de grands ensembles de données à partir de gros fichiers CSV via le processus ETL : Extraire – Transformer – Charger. Vous constaterez peut-être que votre application se bloque toujours lorsque vous essayez d’importer les données. Si vous travaillez avec MongoDB, vous pouvez résoudre l’erreur en ayant une instruction de ligne de commande telle que ;

split -l 1000000 users.csv

Cette commande demande à Node.js de diviser un fichier nommé utilisateurs en plusieurs fichiers de 1 000 000 utilisateurs chacun. L’indicateur -l spécifie que le fichier doit être divisé en fonction du nombre de lignes de code.

#2. Surveiller l’utilisation de la mémoire

Vous pouvez utiliser un profileur de mémoire pour détecter les fuites de mémoire dans votre code. Vous pouvez combiner la mémoire intégrée de Node.js et les ChromeDevTools pour y parvenir. Les deux peuvent détecter les problèmes dans votre code et les résoudre.

Vous pouvez également utiliser des outils externes tels que Datadog, New Relic et AppDynamics pour surveiller les performances de votre application et prendre les mesures nécessaires. Vous pouvez également vérifier l’utilisation de la mémoire sur votre application Node.js via la méthode process.memoryUsage().

#3. Éviter les fuites de mémoire

Des fuites de mémoire se produisent lorsque votre application Node.js conserve des références à des objets dont elle n’a plus besoin. Si ces objets ne sont pas ramassés, il y aura une accumulation d’utilisation de la mémoire au fil du temps.

Il existe plusieurs approches pour éviter les fuites de mémoire, comme éviter les variables globales dans votre code, éviter de bloquer les opérations d’E/S et utiliser les mots-clés let et const lors de la déclaration de vos variables au lieu de var.

#4. Processus de frai

Si vous exécutez Node.js sur une machine avec une mémoire limitée, telle que Raspberry Pi, vous risquez de rencontrer des erreurs de mémoire insuffisante. Vous pouvez avoir un processus maître et d’autres sont regroupés en tant que travailleurs. Dès que le processus maître détecte que le système manque de mémoire, il tue ce processus et assigne la tâche à un autre qui n’est pas surchargé.

#5. Mettre à jour le matériel

Si l’augmentation de l’allocation de mémoire et l’exécution des processus répertoriés de prévention des erreurs de mémoire insuffisante ne résolvent pas vos problèmes, vous pouvez envisager de mettre à jour votre matériel. Node.js peut fonctionner sur une RAM aussi faible que 512 Mo. Cependant, votre application exigera plus de RAM au fur et à mesure de sa croissance.

D’autre part, l’augmentation du nombre de processeurs peut également améliorer l’allocation de mémoire. Idéalement, 2 processeurs ou plus permettront à votre application d’utiliser des threads de travail pour des tâches gourmandes en ressources processeur telles que la cryptographie et le traitement d’images.

FAQ

Qu’est-ce qui cause l’erreur JavaScript Heap Out of Memory ?

Cette erreur peut être causée par plusieurs raisons ;
1. Fuites de mémoire
2. Boucles infinies
3. Présence de nombreux objets dans un projet
4. Présence de grandes structures de données

L’erreur JavaScript Heap Out of Memory peut-elle être résolue ?

Oui. Vous pouvez résoudre l’erreur via;
1. Allouer plus de mémoire virtuelle à Node.js
2. Éliminer les fuites de mémoire
3. Optimiser votre code
4. Mise à niveau de votre matériel

Comment pouvez-vous résoudre l’erreur Heap Out of Memory dans l’application React ?

React est l’une des bibliothèques JavaScript les plus populaires. Localisez le fichier package.json dans le répertoire racine et ces lignes dans la section scripts ;

"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"

}

Emballer

La plupart des développeurs sont habitués aux bogues et aux erreurs de code, et non aux erreurs d’exécution, lorsqu’ils exécutent leurs programmes Node.js. Heureusement, vous n’avez pas à vous inquiéter, car l’erreur de mémoire insuffisante est réparable. Nous avons défini ce qu’est l’erreur JavaScript de mémoire insuffisante, expliqué comment la résoudre et comment l’éviter dans votre prochain projet Node.js.

Ensuite, vous pouvez également lire comment éviter certaines erreurs JavaScript courantes.