3

我有一个 NodeJs 应用程序,它通过 Redis 服务器上的订阅来监听消息。它收集消息 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);

找到的解决方案(至少我是这么认为的):Node 没有崩溃,因为它达到了一些内部内存限制,看起来它崩溃是因为我的 VPS 内存不足,它是一个 2GB VPS 运行一个或两个其他进程。将它升级到 4GB 后,Node 运行平稳,是的,总是在 1.6 到 2.0 GB 左右,但我相信它是 GC 在这里工作的。

4

3 回答 3

7

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

查找泄漏的工具

  • Jimb Esser 的node-mtrace,它使用 GCC mtrace 实用程序来分析堆使用情况。
  • Dave Pacheco 的node-heap-dump拍摄 V8 堆的快照,并将整个内容序列化为一个巨大的 JSON 文件。它包括在 JavaScript 中遍历和调查生成的快照的工具。
  • Danny Coates 的v8-profilernode-inspector为 V8 profiler 提供 Node 绑定,并使用 WebKit Web Inspector 提供 Node 调试界面。
  • Felix Gnass 的同一个分支,用于取消禁用保持器图 Felix Geisendörfer 的节点内存泄漏教程是关于如何使用 v8-profiler 和节点调试器的简短而甜蜜的解释,目前是最先进的大多数 Node.js 内存泄漏调试。
  • Joyent 的 SmartOS 平台,它提供了一系列工具供您使用,用于调试 Node.js 内存泄漏

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

还有另一个博客

于 2013-11-29T07:47:15.533 回答
0

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

于 2013-11-27T00:27:14.157 回答
0

在我看来,您一直在向全局ablv_last_message对象添加键并且从不清理它。

于 2013-10-25T17:40:19.770 回答