2
  1. raw native tcp server 我用一个客户端测试代码并发长连接服务器,什么都不做。5w连接后我关闭了client.js,但是服务器端会有大约100M的内存不释放。

服务器代码:</p>

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);

我将变量设置为 null 但内存没有释放。有人告诉我使用 process.nextTick 来防止长循环,但它仍然不起作用。

4

2 回答 2

2

释放引用并将其设置为 null 后,不会立即释放内存。如果要强制 GC 在给定时刻执行:

  1. 使用 --expose-gc 启动节点

node --expose-gc test.js

  1. 在您的代码中添加对 gc 的调用:

global.gc();

你不应该在生产环境中这样做,因为 V8 自己处理 GC 调用并且在这方面做得很好。

于 2013-06-04T09:17:25.137 回答
0

你的客户端js有问题:

client.on('end', function() {
    console.log('end');
    client.end()
})

此事件将在连接结束发生,您可以通过调用... 来执行此操作,因此调用end 事件.end()没有任何意义。.end()此外,您根本没有关闭连接:

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运行。

于 2013-06-05T10:06:07.767 回答