Boucle infinie JavaScript et limite de mémoire du tas - Erreur fatale : limite du tas atteinte Échec de l'allocation - Tas JavaScript saturé
P粉773659687
P粉773659687 2024-03-27 20:21:43
0
1
470

J'essaie d'exécuter des scripts qui nécessitent qu'une boucle s'exécute indéfiniment (jusqu'à ce qu'une certaine condition soit remplie, mais cela peut prendre une éternité). Les opérations à l'intérieur de la boucle sont très simples, aucune nouvelle variable n'est créée, aucun élément n'est poussé vers le tableau ou aucun nouvel appel n'est effectué. Fondamentalement, du moins à mon avis, aucune nouvelle ressource n'est utilisée à chaque boucle. Cependant, j'ai fini par tomber sur la fameuse erreur :

fatal error: reached heap limit allocation failed - javascript heap out of memory

J'ai étudié l'utilisation de la mémoire dans les boucles et par souci de simplicité, mon problème peut être considéré comme similaire à celui-ci :

async function main(){
    let n = 5;
    while(1){
        console.log("number: " + n + "; squared: " + n**2);
        console.log(process.memoryUsage());
    }    
}

J'ai découvert que même si "ne rien faire", l'utilisation du tas ne cessait de croître à chaque boucle. J'ai essayé la même chose en transformant la boucle en fonction récursive et j'ai obtenu des résultats similaires. Je suis également familier avec la modification de l'allocation de la taille de la mémoire du tas, mais ce n'est pas une solution à cette situation car j'en ai besoin pour fonctionner indéfiniment.

Quelle formule de codage dois-je utiliser pour exécuter une boucle comme celle-ci ? Que dois-je changer pour y parvenir sans augmenter le tas ? Je connais quelque chose sur le Garbage Collector et je peux supposer que c'est cette fonctionnalité qui est à l'origine de la limitation, mais je ne comprends pas vraiment pourquoi. Il me semble que ce que j'essaie de faire est un besoin très simple que beaucoup d'autres personnes rencontreront, et je ne peux pas croire que Java l'ait simplement désactivé.

Merci pour votre réponse

P粉773659687
P粉773659687

répondre à tous(1)
P粉879517403

Je recommande fortement d'utiliser setInterval ou requestAnimationFrame. JavaScript est monothread, ce qui peut conduire à des boucles infinies (même dans les fonctions asynchrones), ce qui peut empêcher l'exécution d'autres codes.

J'espère que cela résout votre problème.

let n = 5;

function someFunction() {
  console.log("number: " + n + "; squared: " + n ** 2);
  console.log(process.memoryUsage());
}

someFunction();
setInterval(performTask, 1000);
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal