NodeJS应用程序带内存泄漏,在哪里?

时间:2013-10-25 16:37:24

标签: node.js

我有一个NodeJs应用程序,它通过Redis服务器上的subscribe来监听消息。它收集消息5秒钟,然后将它们推送到连接的客户端,代码如下所示:

io.sockets.on('connection', function (socket) {
    nClients++;
    console.log("Number of clients connected " + nClients);
    socket.on('disconnect', function () {
        nClients--;
        console.log("Number of clients remaining " + nClients);
    });
});

接收要发送给客户的消息

cli_sub.on("message",function(channel,message) {
        oo = JSON.parse(message);
        ablv_last_message[oo[0]["base"]+"_"+oo[0]["alt"]] = message;
});

setInterval(function() {
    Object.keys(ablv_last_message).forEach( function(key) {
        io.sockets.emit('ablv', ablv_last_message[key]);
    });
    ablv_last_message = [];
}, 5000);

解决方案找到了(至少我是这么认为):节点没有崩溃,因为它达到了一些内部内存限制,它看起来好像因为我的VPS内存耗尽而崩溃,它是一个运行一两个其他的2GB VPS过程也是。在将其升级到4GB后,Node运行顺畅,是的,总是大约1.6到2.0 GB,但我相信它是GC在这里工作的。

3 个答案:

答案 0 :(得分:7)

最好尝试一些工具来查找node.js中的泄漏。

查找泄漏的工具

  • Jimb Esser的node-mtrace,使用了 GCC mtrace实用程序用于配置堆使用情况。
  • Dave Pacheco的node-heap-dump拍摄了V8堆的快照,并在一个巨大的JSON文件中将整个事件序列化。它包括遍历和调查的工具 JavaScript中生成的快照。
  • Danny Coates的v8-profilernode-inspector使用WebKit Web Inspector为V8探查器和Node调试接口提供Node绑定。
  • 菲利克斯·格纳斯的分叉un-disables the retainers graph FelixGeisendörfer的Node Memory Leak Tutorial是关于如何使用v8-profiler和node-debugger的简短而精彩的解释,目前是大多数Node.js内存泄漏调试的最新技术。
  • Joyent的SmartOS平台,为debugging Node.js memory leaks
  • 提供了大量工具供您使用

来自Tracking Down Memory Leaks in Node.js – A Node.JS Holiday Season

另一个blog

答案 1 :(得分:0)

在我看来,您不断向全局ablv_last_message对象添加密钥,并且永远不会清除它。

答案 2 :(得分:0)

您可以使用Object.getOwnPropertyNames而不是Object.keys