node-memwatch: 为节点进行漏出检测和堆积潜水
node-memwatch 是来帮助你发现内存泄露的
节点JS代码. 它规定:
-
A 类
stats全部 MarkSweepCompact GCs 上发布的事件 数据描述您的堆积用量和长期趋势. -
A 类
HeapDiff类,让你比较你的堆积状态 两分时间,告诉你分配了什么,什么 已经释放.
安装
npm install @airbnb/node-memwatch
说明
调试和剖析内存的工具越来越多 节点JS应用程序中的用法,但仍需要 平台独立本地模块,不需要特殊 仪器 本单元试图满足这一需要.
要开始, 导入 node-memwatch 像这样:
var memwatch = require('@airbnb/node-memwatch');
泄漏检测
目前我们探索休克时不支持
高使用率
评估你的记忆足迹的最好方法是看一看堆积
v8完成垃圾收集后立即使用. memwatch 已经
正是这样 - 它检查堆积的使用 只有在GC给你一个稳定
您实际内存使用情况的基线 .
当V8进行垃圾收集时(从技术上讲,我们是在谈论
以密布的光圈盟誓, memwatch 将发出一个 stats
活动.
memwatch.on('stats', function(stats) { ... });
这个 stats 数据会看起来像这样:
{
gcScavengeCount: 1,
gcScavengeTime: 1100880, // ns
gcMarkSweepCompactCount: 2,
gcMarkSweepCompactTime: 21157231, // ns
gcIncrementalMarkingCount: 0,
gcIncrementalMarkingTime: 0, //ns
gcProcessWeakCallbacksCount: 0,
gcProcessWeakCallbacksTime: 0, // ns
total_heap_size: 16097280, // bytes
total_heap_size_executable: 3670016, // bytes
total_physical_size: 10741880, // bytes
total_available_size: 1487689928, // bytes
used_heap_size: 5691584, // bytes
heap_size_limit: 1501560832, // bytes
malloced_memory: 8192,
peak_malloced_memory: 1185464,
gc_time: 4587251 // ns
}
V8有它自己的想法 什么时候才是最好的 GC,和在
重载,它可能会推迟一段时间。 帮助
更快的调试, memwatch 页:1 gc() 将 V8 强制至
做一个完整的GC和堆积的收缩.
挤出水面
对于泄漏隔离,它提供了一个 HeapDiff 需要两个快照和
计算它们之间的分数。 例如:
// Take first snapshot
var hd = new memwatch.HeapDiff();
// do some things ...
// Take the second snapshot and compute the diff
var diff = hd.end();
内容 diff 看起来像:
{
"before": { "nodes": 11625, "size_bytes": 1869904, "size": "1.78 mb" },
"after": { "nodes": 21435, "size_bytes": 2119136, "size": "2.02 mb" },
"change": { "size_bytes": 249232, "size": "243.39 kb", "freed_nodes": 197,
"allocated_nodes": 10007,
"details": [
{ "what": "String",
"size_bytes": -2120, "size": "-2.07 kb", "+": 3, "-": 62
},
{ "what": "Array",
"size_bytes": 66687, "size": "65.13 kb", "+": 4, "-": 78
},
{ "what": "LeakingClass",
"size_bytes": 239952, "size": "234.33 kb", "+": 9998, "-": 0
}
]
}
}
Diff显示在抽样期间
拨款 String 财务报告和审定财务报表 Array 班级减少,但 Leaking Class
增加了9998笔拨款。 对.
你用得着 HeapDiff 在你身边 on('stats') 召回; 即使这样
抓取一个记忆快照,它触发一个 V8 GC,它不会触发
页:1 stats 事件本身。 因为这太傻了.
未来工作
请参见“问题”,以分享建议并作出贡献!