【发布时间】:2015-09-27 15:11:15
【问题描述】:
var redis = require("redis"),
client = redis.createClient();
for(var i =0 ; i < 1000000; i++){
client.publish('channel_1', 'hello!');
}
代码执行后,Node进程消耗1.2GB内存并停留在那里; GC 不会减少分配的内存。如果我模拟 200 万条消息或 4x500000,节点会因内存错误而崩溃。
节点:0.8.*,后来尝试了 4.1.1,但没有任何改变
Redis:2.8,运行良好(分配了 1MB 内存)。
我的服务器每小时将发布超过 100 万条消息。所以这是绝对不能接受的(进程每小时崩溃一次)。
更新测试
var redis = require("redis"),
client = redis.createClient();
var count = 0;
var x;
function loop(){
count++;
console.log(count);
if(count > 2000){
console.log('cleared');
clearInterval(x);
}
for(var i =0 ; i < 100000; i++){
client.set('channel_' + i, 'hello!');
}
}
x = setInterval(loop, 3000);
这分配了 ~ 50Mb,峰值为 200Mb,现在 GC 将内存降回 50Mb
【问题讨论】:
-
对于更真实的测试场景,我建议你做 10,000 条消息,setTimeout 几秒钟以允许垃圾收集完成它的事情,然后再做 10,000 条,等等......看看这是如何工作的。请记住,当您的 JS 正在执行时,垃圾收集不会运行,并且查看进程内存并不意味着 GC 没有完成它。垃圾收集器回收的内存不一定会返回给操作系统,它可能只是在 node.js 中标记为可供将来使用。
-
@jfriend00 好信息,谢谢。
标签: node.js memory-leaks redis node-redis