JavaScript-Endlosschleife und Heap-Speicherlimit – Schwerwiegender Fehler: Heap-Limit erreicht. Zuordnung fehlgeschlagen – JavaScript-Heap nicht mehr genügend Speicher
P粉773659687
P粉773659687 2024-03-27 20:21:43
0
1
384

Ich versuche, einige Skripte auszuführen, die eine Schleife erfordern, um auf unbestimmte Zeit ausgeführt zu werden (bis eine bestimmte Bedingung erfüllt ist, aber das kann ewig dauern). Die Operationen innerhalb der Schleife sind sehr einfach: Es werden keine neuen Variablen erstellt, Elemente in das Array verschoben oder neue Aufrufe durchgeführt. Grundsätzlich werden, zumindest meiner Meinung nach, in jeder Schleife keine neuen Ressourcen verbraucht. Am Ende bin ich jedoch auf den berüchtigten Fehler gestoßen:

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

Ich habe die Speichernutzung in Schleifen untersucht und der Einfachheit halber kann man mein Problem in etwa so betrachten:

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

Ich habe festgestellt, dass trotz „Nichtstun“ die Heap-Nutzung mit jeder Schleife weiter zunahm. Ich habe das Gleiche versucht, indem ich die Schleife in eine rekursive Funktion umwandelte, und ähnliche Ergebnisse erzielt. Ich bin auch mit dem Ändern der Heap-Speichergrößenzuordnung vertraut, aber das ist keine Lösung für diese Situation, da ich es für eine unbegrenzte Ausführung benötige. Welche Codierungsformel sollte ich verwenden, um eine solche Schleife auszuführen? Was muss ich ändern, um dies zu erreichen, ohne den Heap zu vergrößern? Ich weiß etwas über den

Garbage Collector

und kann davon ausgehen, dass diese Funktion die Einschränkung verursacht, kann aber nicht wirklich verstehen, warum. Es scheint mir, dass das, was ich zu tun versuche, ein sehr einfaches Bedürfnis ist, auf das viele andere Leute stoßen werden, und ich kann nicht glauben, dass Java es einfach deaktiviert hat. Vielen Dank für Ihre Antwort

P粉773659687
P粉773659687

Antworte allen(1)
P粉879517403

我强烈建议使用 setInterval 或 requestAnimationFrame。 JavaScript 是单线程的,这可能会导致无限循环(即使在异步函数中),从而可能阻止其他代码的执行。

我希望这能解决您的问题。

let n = 5;

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

someFunction();
setInterval(performTask, 1000);
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!