Node.js 什么是TickObject?如何防止它成为内存泄漏?

Node.js 什么是TickObject?如何防止它成为内存泄漏?,node.js,memory-leaks,Node.js,Memory Leaks,在我的一些脚本中,我已经注意到这一点好几次了。主要是围绕数组迭代和操作的脚本 我一直看到大量内存泄漏,最终导致脚本内存不足并死亡。经过检查,这似乎是由于大量对象被创建而没有清理 一点阅读促使我认为TickObject是节点管理异步事件的一个内部特性。这就是它们的真正用途吗?为什么他们会失控?如何预防呢 如果它有帮助,这里有一个转储(警告它大约312mb)的一个例子,它的螺旋失控 编辑: 设法简化了有问题的代码。奇怪的是,它看起来是使用process.stdout.write的组合 var a =

在我的一些脚本中,我已经注意到这一点好几次了。主要是围绕数组迭代和操作的脚本

我一直看到大量内存泄漏,最终导致脚本内存不足并死亡。经过检查,这似乎是由于大量对象被创建而没有清理

一点阅读促使我认为TickObject是节点管理异步事件的一个内部特性。这就是它们的真正用途吗?为什么他们会失控?如何预防呢

如果它有帮助,这里有一个转储(警告它大约312mb)的一个例子,它的螺旋失控

编辑:

设法简化了有问题的代码。奇怪的是,它看起来是使用process.stdout.write的组合

var a = Array(100)
    .fill()
    .map(_ => Math.round(Math.random()) ? true : false),
    i = 0;

while (true) {
    a.map(_ => !_);
    process.stdout.write(`#${++i}\r`);
}

运行此命令,您将很快耗尽内存。这种行为是意料之中的吗?(我想不是)或者这只是节点的奇怪行为?

解决了这个问题。该数组是一个令人费解的问题,实际上实际的问题是
进程.stdout.write

在每次写入时,每次都会将afterWrite清理函数作为一个对象。由于我们从未离开我们所处的
勾选
/上下文,所以这只会累积到节点爆炸为止。解决方案使任何长时间/永久运行的代码块也与记号异步

var a = Array(100)
    .fill()
    .map(_ => Math.round(Math.random()) ? true : false),
    i = 0;

(function whileLoop () {
    a.map(_ => !_);
    process.stdout.write(`#${++i}\r`);

    process.nextTick(whileLoop);
})();

胜利

谢谢你的来信:)