Node.js 在循环中发出HTTP请求时减少节点内存使用

Node.js 在循环中发出HTTP请求时减少节点内存使用,node.js,memory-leaks,garbage-collection,httprequest,garbage,Node.js,Memory Leaks,Garbage Collection,Httprequest,Garbage,我已经设置了一个简单的循环来轮询一个IronMQ消息传递系统,并且一切正常。。。除了内存使用越来越多,直到它最终稳定在250MB以上。我读到过这样一篇文章,当节点在递归循环中运行时,随着时间的推移使用更多内存是正常的,即使运行setTimeout并且什么也不做,但我仍然不理解这种行为背后的确切机制,或者是否有任何方法来控制它。在循环中发出HTTP请求时,内存使用量会增加一倍以上 该代码在限制为512MB RAM的Heroku worker上运行,没有足够的空间使用集群来使用剩余的可用CPU内核。

我已经设置了一个简单的循环来轮询一个IronMQ消息传递系统,并且一切正常。。。除了内存使用越来越多,直到它最终稳定在250MB以上。我读到过这样一篇文章,当节点在递归循环中运行时,随着时间的推移使用更多内存是正常的,即使运行setTimeout并且什么也不做,但我仍然不理解这种行为背后的确切机制,或者是否有任何方法来控制它。在循环中发出HTTP请求时,内存使用量会增加一倍以上

该代码在限制为512MB RAM的Heroku worker上运行,没有足够的空间使用集群来使用剩余的可用CPU内核。内存使用量可能缓慢增加,也可能极快增加,具体取决于接收消息后运行的作业

这是复制这一点的最简单代码

(function loop() {
  request.get('http://www.example.com', function(err, request, body) {
    if (err) console.log(err);

    setTimeout(loop, 200);
  });
})();
我尝试了很多很多方法来重新构造代码,以防止内存增长过快,但是没有任何改变。只有收到的HTTP响应似乎对使用的RAM上限有任何影响


有没有办法完全重写这一点,或者我被V8的行为所束缚?我发现的所有示例都对无限异步循环使用相同的基本结构,从kue到异步库。

您是否尝试过在循环中的某些点手动运行垃圾收集器?很好。我以前试过偶尔收集。今天早上,我将它设置为收集每次迭代,这样可以控制内存——至少到目前为止是这样。不过,对于生产代码来说,这似乎是一个相当糟糕的主意。是否有某种方法来构造此代码,以便在清除过程中而不是压缩过程中收集请求垃圾?可能GC没有获得足够的机会或足够的周期来运行。我不知道这到底是为什么,但您可以从本文中学到一些有用的东西:。当然,最好知道为什么会有GC问题,但如果没有这个问题,我不认为在重要的时候自己调用GC来减少峰值内存使用有什么错。您只是调整优化以支持比默认设计更频繁的GC,因为这是您想要的