V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
doubleflower
V2EX  ›  Node.js

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

  •  
  •   doubleflower · 2017-09-20 13:54:27 +08:00 · 8144 次点击
    这是一个创建于 2602 天前的主题,其中的信息可能已经有所发展或是发生改变。
    从 Python 转 Node,写了三个微服务,尼玛每一个都出现了内存泄漏,连续运行几天就会 OOM。

    以前 Python 也写过几个,运行个几年都没问题的。
    第 1 条附言  ·  2017-10-08 07:48:04 +08:00
    26 条回复    2017-09-26 14:49:23 +08:00
    iugo
        1
    iugo  
       2017-09-20 14:04:57 +08:00
    闭包用多了吧?

    对象深复制了吗?

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

    嗯,就这一次。
    doubleflower
        14
    doubleflower  
    OP
       2017-09-20 17:21:41 +08:00
    代码有点多没法上。

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

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

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

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

    最后一个压图片的服务只有 200 行代码,太简单了所以没加内存高自杀设置,但运行十几天后内存爆掉了,用了 sharp 这个大 native 库,可能那个库有泄漏。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4167 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:30 · PVG 13:30 · LAX 21:30 · JFK 00:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.