nodejs内存泄漏在几种情况下
- 原始的本地tcp服务器我用一个客户端testing代码来并发长时间连接服务器,什么也不做,5w conncetion后closuresclient.js,但服务器端将有大约100M内存不释放。
服务器代码:
var net = require('net'); var server = net.createServer(function(client) { console.log('server connected'); client.on('data',function(){}); client.on('end',function(){console.log('end');}); }); server.listen(8124, function() { console.log('server bound'); });
客户端代码:
var net = require('net'); var host = '192.168.0.110' // var host = "localhost" , port = 8124 for(var i=0; i < 50000; i++){ var client = net.connect({host: host, port: port}, function(i){ return function() { //'connect' listener var num = i; console.log('client connected ' + num); }}(i) ); client.on('end',function(){ console.log('end'); client.end() }) }
客户端在另一台机器上
2,长循环
var a = b = c = d = []; console.log((process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), 'Mb'); for(i=0;i<50000;i++){ a.push(new Date()); b.push(new Date()); c.push(new Date()); d.push(new Date()); } console.log((process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), 'Mb'); a = null; b = null; c = null; d = null; console.log('null'); console.log((process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), 'Mb'); console.log((process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), 'Mb'); setInterval(function(){ console.log((process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), 'Mb'); },5000);
我将该variables设置为空,但内存不释放。 有人告诉我使用process.nextTick来防止长循环,但它仍然无法正常工作。
取消分配引用并将其设置为空后,内存不会立即释放。 如果你想强制GC在给定的时刻执行:
- 用–expose-gc启动节点
node --expose-gc test.js
- 在你的代码中添加gc的调用:
global.gc();
你不应该在生产中这样做,因为V8正在自己处理GC调用,并且非常好。
您的客户端js存在问题:
client.on('end', function() { console.log('end'); client.end() })
这个事件会在连接结束后发生,你通过调用.end()
,因此在结束事件中调用.end()
是没有任何意义的。 另外,你还没有closures连接:
var client = net.connect({ host: host, port: port }, function(i) { return function() { //'connect' listener var num = i; console.log('client connected ' + num); this.end() //Close the connection } }(i));
修复后,我可以运行你的代码,没有例外,它不会泄漏给我。
服务器代码:
function getUsed() { return process.memoryUsage().heapUsed; } var startedWith; var net = require('net'); var server = net.createServer(function(client) { client.on('data', function() {}); client.on('end', function() { console.log("end"); }); }); server.listen(8124, function() { startedWith = getUsed(); }); setInterval(function() { gc(); }, 13); setInterval(function() { gc(); console.log(getUsed() - startedWith); }, 250)
运行节点0.10 $ node --expose-gc server.js
客户代码:
var net = require('net'); var host = 'localhost', port = 8124 for (var i = 0; i < 1500; i++) { var client = net.connect({ host: host, port: port }, function(i) { return function() { //'connect' listener var num = i; console.log('client connected ' + num); this.end(); } }(i)); client.on('end', function() { console.log('end'); }) }
服务器运行后,运行节点0.10 $ node client.js
。