【问题标题】:Node js memory keep risingNode js内存不断上升
【发布时间】: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-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 开发工具检查之前和之后进行 heapdump,没有发现任何内存泄漏或奇怪行为的结论

那么为什么内存不断增加?

【问题讨论】:

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


    【解决方案1】:

    进行垃圾回收是进程需要做的工作,这意味着它有性能成本。 V8 的 GC 经过仔细调整,可以在尽可能少的 GC 工作和足够快的释放内存之间做出良好的权衡。 163MB 并不是很多已使用的堆,因此在 GC 变得更加活跃之前只需要更长的时间。不用担心,花在 GC 上的时间越少意味着有更多的时间可以运行你的代码:-)

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

    您可能还想更新您的 Node.js。 --trace-gc-verbose 输出表明里面的 V8 已经用了两年多了;这段时间很多事情都得到了改进。

    【讨论】:

    • 此信息来自我的本地 MAC。在生产中,totalmem 和 heapUsed 要大得多,而且 heapUsed 比 totalmem 高得多,我的内存不足。我知道 --max-old-space-size 道具,但我尽量避免使用变通办法,并深入了解其原因(--max-old-space-size 是我最后的手段)。现在我们必须使用非常旧的 Node-js 版本 0.12.6,因为其他依赖项。
    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2019-10-08
    • 2016-09-27
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多