我在Node-J上运行应用程序(向端点发送消息) 我不时需要重新启动应用程序才能清理 “heapUsed”
但是如果我手动运行垃圾收集器(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 dev工具检查之前和之后使用heapdump,并且没有发现任何内存泄漏或奇怪行为的结论
为什么记忆会不断上升?
答案 0 :(得分:0)
进行垃圾收集是流程需要完成的工作,这意味着它具有性能成本。 V8的GC经过精心调整,可以在尽可能少的GC工作之间做出良好的权衡,同时仍能快速释放内存。 163MB并不是很多使用过的堆,因此只需要更长的时间,直到GC变得更加活跃。不用担心,花在GC上的时间减少意味着有更多时间来运行代码: - )
如果希望 V8使用更少的内存(这意味着更早的时间花在GC上,并且如果所需内存超出您设置的限制,则会提前运行到内存不足),您可以使用--max-old-space-size
标志用于配置堆的“旧空间”部分(以兆字节为单位)。 (我建议不要触摸其他空格。)
您可能还想更新Node.js. --trace-gc-verbose
输出表明V8中的V8已超过两年;很多事情都在这个时候得到了改善。