我正在嘗試運行一些需要循環無限期運行的腳本(直到滿足特定條件,但這可能需要永遠)。循環內的操作非常簡單,不會建立新變數、將元素推送到陣列或進行新呼叫。基本上,至少在我看來,每個循環都沒有使用新資源。然而,我最終遇到了臭名昭著的錯誤:
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 就這樣禁用了它。
感謝您的回答
我強烈建議使用 setInterval 或 requestAnimationFrame。 JavaScript 是單線程的,這可能會導致無限循環(即使在非同步函數中),從而可能阻止其他程式碼的執行。
我希望這能解決您的問題。