Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 跟踪节点承诺内存泄漏_Javascript_Node.js_Memory Leaks_Promise_Async Await - Fatal编程技术网

Javascript 跟踪节点承诺内存泄漏

Javascript 跟踪节点承诺内存泄漏,javascript,node.js,memory-leaks,promise,async-await,Javascript,Node.js,Memory Leaks,Promise,Async Await,我正在调试node.js应用程序中的内存泄漏,该应用程序使用了大量异步函数(node 8.x的本机异步)。在“记录分配时间表”中的chrome inspector中,我看到泄漏的大部分内存都是承诺以及这些承诺所保留的对象 所以我想我有一些承诺永远不会兑现。有没有办法跟踪这些承诺以及它们没有完成的原因(例如,在它们被卡住的地方堆叠跟踪)?或者有没有其他方法来跟踪承诺相关的内存泄漏 我看到了一些类似的问题,但列出的所有解决方案似乎都需要大量重写所有代码(主要使用不同的promise库),这在我的情况

我正在调试node.js应用程序中的内存泄漏,该应用程序使用了大量异步函数(node 8.x的本机异步)。在“记录分配时间表”中的chrome inspector中,我看到泄漏的大部分内存都是承诺以及这些承诺所保留的对象

所以我想我有一些承诺永远不会兑现。有没有办法跟踪这些承诺以及它们没有完成的原因(例如,在它们被卡住的地方堆叠跟踪)?或者有没有其他方法来跟踪承诺相关的内存泄漏

我看到了一些类似的问题,但列出的所有解决方案似乎都需要大量重写所有代码(主要使用不同的promise库),这在我的情况下非常困难,特别是因为我通过async/await隐式地使用promises

我还发现node 8.x异步钩子看起来很有趣,但这并不是我所需要的(跟踪资源的创建,而不是承诺被卡住的地方),而且看起来相当低级


如果这很重要的话,部分承诺来自mongoose(带有
mongoose.Promise=global.Promise;
),我的大部分代码都是用Coffeescript编写的。

承诺永远不会完成本身并不是GC问题。一定有某种东西是泄漏的真正源头,它一直在控制着它们,可能还在解决它们。检查内存快照,看哪些东西引用了这些承诺。@Petr承诺也可以由变量持有,但重要的是它由
resolve
函数和持有
resolve
的人持有——在您的示例中是全局超时。如果您设置了类似于
setTimeout(resolve,Infinity)
的内容,承诺将永远不会被解析,并且仍然保留在内存中,但是泄漏的根源不是承诺,而是无限超时。首先要做的是检查堆快照,找出哪些承诺没有得到GCed。然后,一旦您知道它们是什么,就可以开始检查代码,看看谁可能保留了对它们的引用。解决与否并不重要,只有谁还可以参考它们。将来仍可能完成的未完成异步操作可能会保留对承诺的引用(因此它仍然可以解决它),但您的代码可能会被检测以确定哪些异步操作永远不会完成。@RobRaisch-Promises调用它们的
。然后()
在事件循环的下一个刻度上异步处理程序。如果您试图对同步操作使用承诺,那么它们会变慢,因为每次迭代都必须等待事件循环的下一个滴答声。如果每个承诺背后都有一个真正的异步操作,那么通知发生在事件循环的下一个滴答声上并不重要,因为任何真正的异步操作都必须在事件循环的下一个滴答声上进行通知。异步回调就是这样工作的(即使没有承诺)。@RobRaisch-所以你在这里抨击承诺真的是不合适的。请继续谈这个话题。如果OP确实存在promise内存泄漏,那么这是一个编码问题,而不是promise的设计方式问题,而且他们可能会在任何类型的通知系统中遇到问题,因为他们的代码挂在某种不应该出现的引用上。