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

Photo of author

By pierre



Comprendre et Résoudre l’Erreur JavaScript « Heap Out of Memory »

JavaScript est un langage de programmation extrêmement répandu, notamment grâce à sa flexibilité. Pour exécuter du JavaScript en dehors d’un navigateur web, les développeurs s’appuient sur Node.js, un environnement d’exécution multiplateforme.

Cependant, lors de l’exécution de projets Node.js complexes, l’erreur « JavaScript heap out of memory » est une occurrence fréquente.

Cette erreur, signalant un manque de mémoire du tas (heap), survient lorsque la quantité de mémoire vive allouée par défaut par le système devient insuffisante pour gérer les besoins d’un projet gourmand en ressources.

Lorsqu’elle se produit, cette erreur provoque l’arrêt brutal du programme, généralement accompagné d’un message similaire à :

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

Ou encore :

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

Facteurs Déclencheurs de l’Erreur « Heap Out of Memory »

  • Structures de données volumineuses : L’utilisation de structures de données importantes, comme des matrices ou des tableaux de grande taille, peut rapidement saturer la mémoire allouée.

Par exemple, un tableau contenant un milliard d’éléments peut facilement provoquer cette erreur :

let tableau = [];

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

    tableau.push(i);

}
  • Gestion déficiente de la mémoire : Une application mal conçue, qui ne libère pas correctement les objets devenus inutiles, risque d’accumuler des fuites de mémoire.

Voici un exemple de code qui peut engendrer une fuite de mémoire :

let tableau = [];

setInterval(function() {

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

}, 1000);
  • Boucles infinies : Une boucle qui ne se termine jamais peut accaparer la mémoire jusqu’à épuisement.

Un exemple de boucle infinie susceptible de déclencher cette erreur :

while (true) {

       console.log(1);

}

Les boucles infinies consomment rapidement les ressources mémoires, ce qui peut mener à cette erreur.

  • Fonctions récursives : Les fonctions récursives, qui s’appellent elles-mêmes, peuvent conduire à des fuites de mémoire si elles ne sont pas correctement gérées.
  • Abondance d’objets : Un code comportant un grand nombre d’objets, surtout s’ils sont volumineux, peut dépasser les capacités de la mémoire.

Solutions pour Remédier à l’Erreur « Heap Out of Memory » en JS

Cette erreur peut se manifester sur différents systèmes d’exploitation (Windows, macOS, Linux comme Ubuntu). Heureusement, des solutions existent, quel que soit l’environnement utilisé.

#1. Résoudre l’Erreur sur Windows

Étape 1 : Accédez au menu Démarrer et recherchez « Paramètres système avancés ».

Étape 2 : Dans la fenêtre qui s’ouvre, cliquez sur « Variables d’environnement ».

Étape 3 : Choisissez « Nouveau » dans la section « Variables utilisateur » ou « Variables système ». La première option limitera la modification à votre compte utilisateur, tandis que la seconde l’appliquera à tout le système.

Étape 4 : Entrez `NODE_OPTIONS` comme nom de variable, et `–max-old-space-size=4096` comme valeur. Cette valeur attribue 4 Go de mémoire virtuelle à Node.js. Vous pouvez ajuster cette valeur pour augmenter la mémoire (par exemple, `–max-old-space-size=8192` pour 8 Go).

Étape 5 : Validez les changements en cliquant sur « OK », « Appliquer » puis à nouveau « OK ».

Il est également possible d’utiliser le terminal Windows PowerShell :

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

Une solution temporaire consiste à utiliser cette commande avant de lancer l’application :

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

#2. Correction de l’Erreur sur Linux

  • Étape 1 : Identifiez la source de l’erreur en consultant les logs ou la console pour repérer le code fautif.
  • Étape 2 : Exportez une variable d’environnement pour spécifier la mémoire allouée à Node.js :
export NODE_OPTIONS=--max-old-space-size=4096

Ces étapes réservent 4 Go à Node.js. Si le problème persiste, doublez la valeur :

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

#3. Résolution de l’Erreur sur macOS

La démarche sur macOS est similaire à celle de Linux :

  • Étape 1 : Repérez le code à l’origine de l’erreur grâce aux journaux ou à la console.
  • Étape 2 : Exportez une variable d’environnement pour définir la mémoire allouée à Node.js :
export NODE_OPTIONS=--max-old-space-size=4096

Là encore, ajustez la valeur en cas de persistance de l’erreur, par exemple en doublant :

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

Augmenter la Mémoire lors de l’Installation de Packages NPM

Les méthodes précédentes concernent l’exécution d’applications Node.js. Il est aussi possible d’allouer plus de mémoire pour résoudre l’erreur lors de l’installation de paquets :

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

N’hésitez pas à augmenter progressivement la mémoire allouée (1 Go, 2 Go, 3 Go, etc.), en spécifiant la taille en Mo. Évitez cependant d’allouer toute la mémoire disponible, ce qui pourrait provoquer l’instabilité du système. En général, sur une machine équipée de 16 Go de RAM, on peut allouer jusqu’à 8 Go à Node.js.

Prévenir l’Erreur « Heap Out of Memory » en JavaScript

Au-delà de la résolution, des mesures préventives peuvent être mises en place pour éviter que cette erreur ne se produise :

#1. Découpage des Données

Si votre application Node.js importe de vastes ensembles de données (par exemple, depuis de gros fichiers CSV via un processus ETL), vous pouvez diviser ces données en segments plus petits. Par exemple, pour diviser un fichier `utilisateurs.csv` en plusieurs fichiers de 1 000 000 d’utilisateurs :

split -l 1000000 users.csv

L’option `-l` spécifie le nombre de lignes par fichier.

#2. Surveillance de l’Utilisation de la Mémoire

Des outils comme les profileurs de mémoire permettent de détecter les fuites de mémoire dans votre code. Les outils de développement de Chrome peuvent être utilisés en combinaison avec les outils intégrés à Node.js pour diagnostiquer et résoudre les problèmes.

Des solutions externes comme Datadog, New Relic ou AppDynamics peuvent être utilisées pour une surveillance plus poussée. L’utilisation de `process.memoryUsage()` vous permet de suivre la consommation mémoire de votre application Node.js.

#3. Prévention des Fuites de Mémoire

Les fuites de mémoire se produisent quand votre application garde des références à des objets qui ne sont plus nécessaires. Si ces objets ne sont pas libérés, l’utilisation de la mémoire augmentera progressivement. Pour éviter ces fuites, évitez les variables globales, n’effectuez pas d’opérations d’E/S bloquantes et utilisez les mots-clés `let` et `const` lors de la déclaration de vos variables plutôt que `var`.

#4. Gestion des Processus

Sur les systèmes à mémoire limitée, comme un Raspberry Pi, vous pouvez utiliser un processus maître qui délègue le travail à d’autres processus. Si le processus maître détecte un manque de mémoire, il peut arrêter un processus surchargé et réassigner la tâche à un autre.

#5. Mise à Niveau du Matériel

Si les solutions précédentes ne suffisent pas, la mise à niveau du matériel peut être une option. Node.js peut fonctionner avec aussi peu que 512 Mo de RAM, mais votre application exigera plus de ressources à mesure de sa croissance. De même, augmenter le nombre de cœurs de processeur peut améliorer la gestion de la mémoire, notamment pour les tâches gourmandes comme le cryptage ou le traitement d’images.

FAQ

Qu’est-ce qui provoque l’erreur « JavaScript Heap Out of Memory » ?

Plusieurs facteurs peuvent déclencher cette erreur :
1. Fuites de mémoire
2. Boucles infinies
3. Présence d’un grand nombre d’objets dans le projet
4. Utilisation de structures de données volumineuses

L’erreur « JavaScript Heap Out of Memory » est-elle réparable ?

Oui. Il existe plusieurs approches pour corriger cette erreur :
1. Allouer davantage de mémoire virtuelle à Node.js
2. Éliminer les fuites de mémoire
3. Optimiser le code
4. Mettre à niveau le matériel

Comment résoudre l’erreur « Heap Out of Memory » dans une application React ?

Dans le fichier `package.json`, modifiez la section `scripts` comme suit :

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

    }

Conclusion

Les erreurs d’exécution sont parfois déroutantes, mais l’erreur « Heap Out of Memory » peut être résolue. Nous avons expliqué la nature de cette erreur, les méthodes pour la corriger et les moyens de la prévenir.

Vous pouvez également consulter nos articles traitant des erreurs fréquentes en JavaScript pour une compréhension plus approfondie.