我正在尝试运行一些需要循环无限期运行的脚本(直到满足特定条件,但这可能需要永远)。循环内的操作非常简单,不会创建新变量、将元素推送到数组或进行新调用。基本上,至少在我看来,每个循环都没有使用新资源。然而,我最终遇到了臭名昭著的错误:
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 是单线程的,这可能会导致无限循环(即使在异步函数中),从而可能阻止其他代码的执行。
我希望这能解决您的问题。