doubleflower
V2EX  ›  Node.js

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

  •  
  •   doubleflower · Sep 20, 2017 · 9259 views
    This topic created in 3181 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
        1
    iugo  
       Sep 20, 2017
    闭包用多了吧?

    对象深复制了吗?

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

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

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

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

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

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

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