节点js内存不断上升

时间:2017-07-11 17:14:12

标签: node.js memory-leaks garbage-collection v8

我在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-statsgc-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,并且没有发现任何内存泄漏或奇怪行为的结论

为什么记忆会不断上升?

1 个答案:

答案 0 :(得分:0)

进行垃圾收集是流程需要完成的工作,这意味着它具有性能成本。 V8的GC经过精心调整,可以在尽可能少的GC工作之间做出良好的权衡,同时仍能快速释放内存。 163MB并不是很多使用过的堆,因此只需要更长的时间,直到GC变得更加活跃。不用担心,花在GC上的时间减少意味着有更多时间来运行代码: - )

如果希望 V8使用更少的内存(这意味着更早的时间花在GC上,并且如果所需内存超出您设置的限制,则会提前运行到内存不足),您可以使用--max-old-space-size标志用于配置堆的“旧空间”部分(以兆字节为单位)。 (我建议不要触摸其他空格。)

您可能还想更新Node.js. --trace-gc-verbose输出表明V8中的V8已超过两年;很多事情都在这个时候得到了改善。