doubleflower
V2EX  ›  Node.js

你们写的 NodeJS 程序有没有内存泄漏?

  •  
  •   doubleflower · Sep 20, 2017 · 9725 views
    This topic created in 3334 days ago, the information mentioned may be changed or developed.
    从 Python 转 Node,写了三个微服务,尼玛每一个都出现了内存泄漏,连续运行几天就会 OOM。

    以前 Python 也写过几个,运行个几年都没问题的。
    Supplement 1  ·  Oct 8, 2017
    26 replies  •  2017-09-26 14:49:23 +08:00
    iugo
    iugo
    Sep 20, 2017
    1
    闭包用多了吧?

    对象深复制了吗?

    函数副作用太多了?
    SPACELAN
    SPACELAN
    Sep 20, 2017
    2
    我记得最近有个版本的 node 本身就有 ssl 上的内存泄露。。
    keenwon
    keenwon
    Sep 20, 2017
    3
    上代码
    janxin
    janxin
    Sep 20, 2017
    4
    Python 也有内存泄漏啊...不过一般 wsgi 会自动进程重启
    Node 内存泄漏挺常见的,不过你这么严重的换个最新版本看看,如果还有问题应该还是使用有问题
    root787
    root787
    Sep 20, 2017
    5
    可以试试 --max-old-space-size 这个参数。
    meisky6666
    meisky6666
    Sep 20, 2017❤️1
    6
    神 tag
    tongchia
    tongchia
    Sep 20, 2017
    7
    @meisky6666 😆 神回复
    ygjack
    ygjack
    Sep 20, 2017
    8
    你用什么框架写微服务?
    solee
    solee
    Sep 20, 2017
    9
    我们公司用 node 写的很多服务,几个跑在一台阿里云上也。几年也没问题啊,上代码才是关键。
    yizi
    yizi
    Sep 20, 2017
    10
    之前用 4.4.6 版本的时候发现内存回收有问题,用了 v7.4.0 就舒服多了,代码一点没动。
    misaka19000
    misaka19000
    Sep 20, 2017 via Android
    11
    同样会经常内存爆掉,问下大神频繁的使用 promise 模式会导致内存过高吗?
    xream
    xream
    Sep 20, 2017 via iPhone
    12
    懒得排查就设置 pm2 超内存自动重启…
    catinsides
    catinsides
    Sep 20, 2017
    13
    有一次循环变量忘改了,运行的时候感觉好慢,就去了趟厕所,回来的时候报内存泄漏。

    嗯,就这一次。
    doubleflower
    doubleflower
    OP
    Sep 20, 2017
    14
    代码有点多没法上。

    目前暂时用一个 setInterval 检查 process.memoryUsage()看内存是否高到指定值就主动自杀重启避免用光内存。

    以后有空了需要用正规方法看一下到底是哪个地方有泄漏。
    xiaoniuback
    xiaoniuback
    Sep 20, 2017
    15
    排查一下是否有太多对象做缓存没有释放,或者一些队列没有释放,长期驻在老生代中,就会泄露
    mooncakejs
    mooncakejs
    Sep 20, 2017
    16
    node 某几个版本有内存泄露的 bug, 你搜搜。
    不行上自动重启。
    lianyue
    lianyue
    Sep 20, 2017 via iPhone
    17
    想简单解决的话用 pm2 就好了
    marvinwilliam
    marvinwilliam
    Sep 20, 2017
    18
    写了好多个服务,小的倒是会出现这个问题,大的到现在还没遇到.

    然后你那个 M 之前的是什么数字....
    kn007
    kn007
    Sep 20, 2017 via Android
    19
    有
    my3157
    my3157
    Sep 20, 2017
    20
    之前有个项目, 怀疑内存泄露, 一直没找到原因, 后来, 在 配置了 pm2 自动重启, 内存到 1G 就自动重启, 一直到现在稳定运行~~
    springwarm
    springwarm
    Sep 20, 2017
    21
    @marvinwilliam Out Of Memory
    Pastsong
    Pastsong
    Sep 20, 2017
    22
    内存泄漏是 NodeJS 的一部分,不爽不要写...
    vebuqi
    vebuqi
    Sep 20, 2017
    23
    定时调一下 gc ?
    RickyWonng
    RickyWonng
    Sep 26, 2017
    25
    之前写的高负载爬虫出现过内存炸的情况,但不是内存泄露,只是闭包引用导致的内存占用过高,调节一下负载,减少变量传递,注意点用字符串函数就可以了。
    doubleflower
    doubleflower
    OP
    Sep 26, 2017
    26
    @RickyWonng 对,现在我发现了,我的三个服务只有一个是有泄漏的。

    其中二个是头一天运行的内存都在 400M 以内,二天后慢慢上去,会稳定在 700M RSS,我的内存自杀阀值 512 设得太低了。(难道是和 V8 有关,运行次数多了后 JIT 优化代码导致内存使用增加)。

    最后一个压图片的服务只有 200 行代码,太简单了所以没加内存高自杀设置,但运行十几天后内存爆掉了,用了 sharp 这个大 native 库,可能那个库有泄漏。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   896 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 63ms · UTC 21:56 · PVG 05:56 · LAX 13:56 · JFK 16:56
    ♥ Do have faith in what you're doing.