【发布时间】:2017-12-15 21:17:57
【问题描述】:
我有在 Node-Js 上运行的应用程序(向端点发送消息) 有时我需要重新启动应用程序才能清理 “堆使用”
但是如果我手动运行垃圾收集器 (global.gc()) 我会看到它清理了内存 但是当垃圾收集器自动运行时它不会(“heapUsed”不断上升)
我添加 --trace_gc --trace_gc_verbose 节点参数以确保 GC 自动运行并发现到以下日志:
...
[49366] 548769 ms: Scavenge 54.0 (163.5) -> 39.0 (163.5) MB, 5.5 ms [allocation failure].
[49366] Memory allocator, used: 167396 KB, available: 1331740 KB
[49366] New space, used: 681 KB, available: 15702 KB, committed: 32768 KB
[49366] Old pointers, used: 22615 KB, available: 63597 KB, committed: 92601 KB
[49366] Old data space, used: 12236 KB, available: 11704 KB, committed: 24378 KB
[49366] Code space, used: 3335 KB, available: 2564 KB, committed: 5976 KB
[49366] Map space, used: 1027 KB, available: 5010 KB, committed: 6174 KB
[49366] Cell space, used: 17 KB, available: 98 KB, committed: 128 KB
[49366] PropertyCell space, used: 26 KB, available: 37 KB, committed: 64 KB
[49366] Large object space, used: 0 KB, available: 1330699 KB, committed: 0 KB
[49366] All spaces, used: 39939 KB, available: 98715 KB, committed: 162089 KB
[49366] External memory reported: -299 KB
...
我也使用 Node js gc-heap-stats 和 gc-profiler 确保 GC 正在运行并且发现也适用于 Scavenge 和 Marksweep 算法
我监控
freemem 使用OS.freemem()
totalmem 使用OS.totalmem()
memUsage 使用process.memoryUsage()
结果如下所示:
"freemem": 509698048,
"totalmem": 17179869184,
"memUsage": {
"rss": 281284608,
"heapTotal": 212272640,
"heapUsed": 184643248
}
手动运行垃圾收集器后(使用 global.gc()):
"freemem": 443863040,
"totalmem": 17179869184,
"memUsage": {
"rss": 276410368,
"heapTotal": 207112960,
"heapUsed": 57413400
}
我也在使用 chrome 开发工具检查之前和之后进行 heapdump,没有发现任何内存泄漏或奇怪行为的结论
那么为什么内存不断增加?
【问题讨论】:
标签: node.js memory-leaks garbage-collection v8