nodejs内存泄漏在几种情况下

  1. 原始的本地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来防止长循环,但它仍然无法正常工作。

Solutions Collecting From Web of "nodejs内存泄漏在几种情况下"

取消分配引用并将其设置为空后,内存不会立即释放。 如果你想强制GC在给定的时刻执行:

  1. 用–expose-gc启动节点

node --expose-gc test.js

  1. 在你的代码中添加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