2015-02-05 113 views
0

有人可以解释为什么下面的代码导致节点的内存使用量爆炸并永不恢复?节点内存使用与HTTP请求

我明白为什么它会导致内存使用率上升,但它永远不会回落。

我正在做的事情,我不认为应该是必要的(设置变量为null)努力导致垃圾收集,但它没有什么差别。

我也试过使用--expose-gcglobal.gc(),但它没有帮助。

我在这里错过了一个参考,或者是否有更大的问题?

var https = require("https") 

var i = 0; 
while(i < 200) { 

    var req = https.request({ 
    host: 'host.com', 
    path: '/endpoint', 
    method: 'POST', 
    headers: { 
     'Content-Type': 'text/csv', 
     'Authorization': 'Basic abc123' 
    } 
    }, function(res) { res.resume(); res=null; }); 
    req.data = "a,b,c"; 
    req.write(req.data); 
    req.end(); 
    req = null; 
    i++; 
} 

回答

0

节点GC是“懒”,它倾向于保持在他的“老空间”的内存,直到它达到和硬限制(约1.4 /的1.5Gb在64位ENV)。 在我们的案例中(大量的http请求),内存越来越高,直到达到该阈值,然后再次回到200Mb。

您可以使用--trace-gc--trace-gc-verbose来查看使用哪种内存。您可以设置--max-old-space-size以强制节点具有小于1.4Gb的限制,从而更频繁地触发GC(它可以影响性能,完整的GC是同步的并冻结线程)。