首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用socket.io + node.js的内存泄漏

使用socket.io + node.js的内存泄漏
EN

Stack Overflow用户
提问于 2011-06-24 16:31:18
回答 2查看 5.7K关注 0票数 33

我的Node.js应用程序似乎有内存泄漏。我快速地构建了它,而且我的JavaScript不太强,所以这可能很容易。

我在上面做了一些堆转储,这是字符串object吗?内存泄漏,速度约每5分钟1MB。我展开了字符串,它实际上是String.Array?

堆堆栈:

代码语言:javascript
运行
复制
#!/usr/local/bin/node

var port = 8081;

var io = require('socket.io').listen(port),
sys = require('sys'),
daemon = require('daemon'),
mysql = require('mysql-libmysqlclient');

var updateq = "SELECT 1=1";
var countq = "SELECT 2=2";

io.set('log level', 2);


process.on('uncaughtException', function(err) {
  console.log(err);
});

var connections = 0;

var conn = mysql.createConnectionSync();
dbconnect();

io.sockets.on('connection', function(client){ 
  connections++;
  client.on('disconnect', function(){ connections--;  }) 
});

process.on('exit', function () {
    console.log('Exiting');
    dbdisconnect();
});

function dbdisconnect() {
     conn.closeSync();
}

function dbconnect() {
    conn.connectSync('leet.hacker.org','user','password');
}


function update() {
    if (connections == 0)
        return;
    conn.query(updateq, function (err, res) {
      if (err) {
        dbdisconnect();
        dbconnect();
        return;
      }
      res.fetchAll(function (err, rows) {
        if (err) {
          throw err;
        }
        io.sockets.json.send(rows);
      });
    });
}

function totals() {
    if (connections == 0)
        return;
        conn.query(countq, function (err, res) {
          if (err) {
        // Chances are that the server has just disconnected, lets try reconnecting
        dbdisconnect();
        dbconnect();
            throw err;
          }
          res.fetchAll(function (err, rows) {
            if (err) {
              throw err;
            }
        io.sockets.json.send(rows);
          });
        });

}

setInterval(update, 250);
setInterval(totals,1000);

setInterval(function() {
console.log("Number of connections: " + connections);
},1800000);



  daemon.daemonize('/var/log/epiclog.log', '/var/run/mything.pid', function (err, pid) {
    // We are now in the daemon process
    if (err) return sys.puts('Error starting daemon: ' + err);

    sys.puts('Daemon started successfully with pid: ' + pid);
  });

当前版本

代码语言:javascript
运行
复制
function totals() {

        if (connections > 0)
        {
                var q = "SELECT query FROM table";

            db.query(q, function (err, results, fields) {
            if (err) {
                    console.error(err);
                    return false;
            }

            for (var row in results)
            {
                    io.sockets.send("{ ID: '" + results[row].ID + "', event: '" + results[row].event + "', free: '" + results[row].free + "', total: '" + results[row].total + "', state: '" + results[row]$
                    row = null;
            }


            results = null;
            fields = null;
            err = null;
            q = null;
            });
    }
}

内存仍在泄漏,但似乎只有在以下情况下:

  • 从启动,没有客户端->精细
  • 第一客户端连接->精细
  • 第二客户端(即使第一客户端断开和重新连接) ->泄漏内存
  • 停止所有连接->精细<代码>H 1151个新连接(连接= 1) ->泄漏内存<代码>H 216<代码>F 217
EN

回答 2

Stack Overflow用户

发布于 2011-07-07 11:02:04

帮你自己一个忙,使用node-mysql,它是一个纯javascript客户端,而且速度很快。除此之外,您应该在工作时使用异步代码来阻止IO被阻塞。在这里使用async库将对您有所帮助。它有瀑布回调的代码,其中包括传递。

至于您的内存泄漏,它可能不是socket.io,虽然我已经几个月没有使用它了,但我已经有数千个并发连接,没有泄漏内存,我的代码也不是最好的。

然而,有两件事。首先,您的代码是无法读取的。我建议适当地格式化您的代码(我为每个缩进使用两个空格,但有些人使用四个)。其次,每半小时打印一次连接数似乎有点傻,因为您可以这样做:

代码语言:javascript
运行
复制
setInterval(function() {
  process.stdout.write('Current connections: ' + connections + '     \r');
}, 1000);

\r将导致该行被读回行的开头,并覆盖其中的字符,这将取代行,而不会产生大量的回滚。如果您选择将调试详细信息放在日志记录中,这将有助于调试。

您还可以使用process.memoryUsage()快速检查内存使用情况(或节点认为使用了多少)。

票数 5
EN

Stack Overflow用户

发布于 2012-05-02 19:46:32

这是否与客户端断开时未正确清除连接的客户端数组有关?数组值被设置为NULL,而不是从数组中删除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6470872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档