node.js memwatch追逐内存泄漏

时间:2014-09-01 11:40:50

标签: node.js memory-leaks node-memwatch

我一直在节点程序中追逐一个非常糟糕的内存泄漏。

我正在使用memwatch模块HeapDiff()来尝试识别有问题的对象。

HeapDiff的报告显示了详细数组中的两个可疑元素(“数组”和“字符串”,每个元素都有相当大的增长。

我正式迷失了,不知道如何缩小可能的罪魁祸首。 有几十个google-able howtos,但没有一个对我有任何意义。该程序使用了相当多的第三方模块,包括carrier,dequeue和mqtt。这是318行代码所以我没有发布它。

我很感激我的下一步应该是什么......

以下是memap HeapDiff转储的摘录:

   {
    "before": {
        "nodes": 25312,
        "time": "2014-09-01T10:59:24.000Z",
        "size_bytes": 3596320,
        "size": "3.43 mb"
    },
    "after": {
        "nodes": 125705,
        "time": "2014-09-01T11:14:24.000Z",
        "size_bytes": 20255728,
        "size": "19.32 mb"
    },
    "change": {
        "size_bytes": 16659408,
        "size": "15.89 mb",
        "freed_nodes": 674,
        "allocated_nodes": 101067,
        "details": [
           {
                "what": "Array",
                "size_bytes": 348440,
                "size": "340.27 kb",
                "+": 1592,
                "-": 295
            },
            {
                "what": "String",
                "size_bytes": 12580056,
                "size": "12 mb",
                "+": 50329,
                "-": 20
            }
        ] 

2 个答案:

答案 0 :(得分:2)

如果没有代码示例,很难详细介绍,但是很高级......

我所做的不只是看最大的类别(因为我的也是数组和字符串[1]),但寻找我可以追踪的对象类型;找到任何显着增长的行,并且看起来很独特" what"条目,然后找到它们在您的代码中的位置。围绕您的使用做出新的差异,缩小或展开,直到找到您的增长点。

如果找不到可疑的对象名称,只需将主执行路径分成两个或三个部分,然后为每个部分运行HeapDiff。 (你目前用什么来触发你的HeapDiff?启动和.on('泄漏')?)

  1. 顺便说一句,那并不是说单个字符串是12mb。它说有12mb的字符串 - 实际上,12mb 更多的字符串比diff的前端更多。那些12mb分布在50329个新字符串上。所以,他们仍然相当大。

答案 1 :(得分:0)

我建议您尝试使用IDDE工具,看看这是否有助于您追踪泄漏?请参阅此[link] :( What diagnostic tools are available for Node.js applications?)获取一些信息。如果您需要更多信息来开始,我非常乐意提供帮助。