我正在使用Node v8.10.0
上面的问题解释了Node.js如何不再支持TCO。我最近遇到了如下功能的问题:
async function processBatch(nthBatch) {
// do a bunch of async work and build up variables
await processBatch(nthBatch + 1);
}
该代码有内存泄漏,可通过将其更改为以下内容立即解决:
async function processBatch(nthBatch) {
// do a bunch of async work and build up variables
return processBatch(nthBatch + 1);
}
令我惊讶的是,它确实有效,因为在上述问题中,它清楚地说明了Node 8.x不支持TCO。那么,有什么特别的事情可以在这里启用TCO?还是因为它在引擎盖下使用生成器并且返回标记生成器已完成,所以可以丢弃堆栈?
async function processBatch(nthBatch) {
// do a bunch of async work and build up variables
await processBatch(nthBatch + 1);
}
该代码段导致内存泄漏,因为注释处声明的变量无法进行垃圾回收,因为解释器不知道将不再需要它们。例如,解释器当时不知道在后面没有一行await
可能需要所有声明的变量。
async function processBatch(nthBatch) {
// do a bunch of async work and build up variables
return processBatch(nthBatch + 1);
}
在此示例中,该函数被返回,因此垃圾收集器可以安全地清除方法中声明的变量。请注意,堆栈会停留在周围,并且如果此递归函数的迭代次数过多,则会Maximum call stack size exceeded
引发错误,但是声明为实况的变量在堆中,因此可以在保持堆栈信息完整的同时进行垃圾回收。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句