JavaScript無限循環與堆記憶體限制 - 致命錯誤:達到堆限制分配失敗 - JavaScript堆記憶體不足
P粉773659687
P粉773659687 2024-03-27 20:21:43
0
1
453

我正在嘗試運行一些需要循環無限期運行的腳本(直到滿足特定條件,但這可能需要永遠)。循環內的操作非常簡單,不會建立新變數、將元素推送到陣列或進行新呼叫。基本上,至少在我看來,每個循環都沒有使用新資源。然而,我最終遇到了臭名昭著的錯誤:

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

我一直在研究循環中的記憶體使用情況,為了簡單起見,我的問題可以被認為與此類似:

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

我發現儘管“什麼也沒做”,但每個循環的堆使用量都在不斷增長。我嘗試了相同的將循環轉變為遞歸函數,得到了類似的結果。我也熟悉更改堆記憶體大小分配,但這不是這種情況的解決方案,因為我需要它無限期地運行。

我應該使用什麼編碼公式來運行這樣的循環?我應該改變什麼才能在不增加堆的情況下實現這一點?我對垃圾收集器有所了解,我可以認為正是這個功能造成了限制,但無法真正理解原因。在我看來,我想做的這件事是一個非常簡單的需求,許多其他人都會遇到過,我不敢相信 Java 就這樣禁用了它。

感謝您的回答

P粉773659687
P粉773659687

全部回覆(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);
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板