0

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

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

HeapDiff 的报告显示了 details 数组中的两个可疑元素(“Array”和“String”,每个元素都有相当大的增长。

我正式迷路了,不知道如何缩小可能的罪魁祸首。有几十个 google-able howtos,但对我来说没有任何意义。有问题的程序使用了很多 3rd 方模块,包括载体、出队和 mqtt。这是 318 行代码,所以我没有发布它。

我会很感激任何关于我下一步应该做什么的指示......

这是 memwatch 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
            }
        ] 
4

2 回答 2

2

没有代码示例,很难深入细节,但在高层次上......

我所做的不仅是查看最大的类别(因为我的也是 Array 和 String[1]),而是寻找我可以追踪的对象类型;找到有任何显着增长的行和独特的“什么”条目,然后找到它们在你的代码中的位置。围绕您对这些的使用进行新的差异,并缩小或分散,直到找到您的增长点。

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

  1. 顺便说一句,这并不是说有一个 12mb 的字符串。就是说有 12mb 的字符串——实际上,比 diff 前端的字符串多12mb 。那些 12mb 分布在 50329 个新字符串上。因此,它们仍然相当大。
于 2015-02-01T06:49:26.437 回答
0

我可以建议您尝试一下 IDDE 工具,看看这是否可以帮助您追踪泄漏?请参阅此 [链接]:( Node.js 应用程序可以使用哪些诊断工具?)以获取一些信息。如果您需要更多信息才能开始使用,我非常乐意为您提供帮助。

于 2015-06-17T03:36:24.820 回答