我一直在节点程序中追逐一个非常糟糕的内存泄漏。
我正在使用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
}
]
答案 0 :(得分:2)
如果没有代码示例,很难详细介绍,但是很高级......
我所做的不只是看最大的类别(因为我的也是数组和字符串[1]),但寻找我可以追踪的对象类型;找到任何显着增长的行,并且看起来很独特" what"条目,然后找到它们在您的代码中的位置。围绕您的使用做出新的差异,缩小或展开,直到找到您的增长点。
如果找不到可疑的对象名称,只需将主执行路径分成两个或三个部分,然后为每个部分运行HeapDiff。 (你目前用什么来触发你的HeapDiff?启动和.on('泄漏')?)
答案 1 :(得分:0)
我建议您尝试使用IDDE工具,看看这是否有助于您追踪泄漏?请参阅此[link] :( What diagnostic tools are available for Node.js applications?)获取一些信息。如果您需要更多信息来开始,我非常乐意提供帮助。