发现Express 框架有内存泄露!! 大家有遇到吗?
发布于 10天前 作者 jerrywu55 911 次浏览 来自 问答

我的项目中就发现有内存泄露,

于是我用generator-express 生成了一个express 框架, 然后用 pm2 运行来检测内存。

首页路由

  app.get('/',function(req,res){
          res.send('ok');
  });

发现每次刷新首页的时候,内存就会涨 1m左右,并且不会降,然道是中间件产生了内存泄露了吗?

不知道大家有没遇到!! 希望大家一起探讨解答。

38 回复

@alsotang 不知道 cnodejs 社区 代码有没有遇到内存泄露呢?

@alsotang 貌似是有 数组没有被释放掉。。。 然后是垃圾回收不及时吗?

是用内存做session把?

确定不应该用res.end()

可以用代码强制gc()再看看 自豪地采用 CNodeJS ionic

@xieren58 不是,connect-mongo 做session, 就算是内存的话,当个用户一直刷应该不会导致内存增加

@virteman js 里怎么gc呢? 请原谅我。。。。

Express 只有在代理静态资源上有内存泄露。其他没有。

我天 我也发现这个问题了 可一直没找出究竟

NODE的回收机制的问题

@struCoder app.use(express.static(path.join(__dirname, 'public'), {maxAge: 31536000})); 意思是这行的代码的原因?

@p412726700 我把中间件全部注释了 ,还是有内存增长

@struCoder 我把中间件全部注释了 ,还是有内存增长

node进程启动起来,你什么都不做不发请求,内存也会增长,不过过一段时间就会回收,回收没那么快,如果你的程序静默很久,内存回收很厉害,一个静默的express应用,内存最后差不多能稳定到到几兆左右。

找到一个临时解决方案 在启动的时候加上 --max-old-space-size=MEM 例:node --max-old-space-size=256 app.js 这样内存增长到230+的时候 就不再增长

node的内存回收机制是这样把

我在想,要是并非很大时,内存是不是得爆掉。

@soliury 这样一想,高并发时的确好可怕:(

楼主用chrome测node?

@DavidCai1993 @alsotang 阿里遇到这种问题是如何处理的?来讲讲嘛

惊呆了~前排围观。

@jerrywu55

每10s回收一次

setInterval(function(){ console.log( ‘NOW gc …’ ); global.gc(); }, 10000);

启动时要加上v8的expose_gc参数。

node --expose_gc app.js

@jerrywu55 如何释放数组,将引用设置为null么?

@p412726700 node --help怎么看不到你用的这个选项?

@soliury 前端时间我碰到了内存泄露。然后在程序里面写了个脚本检测内存大小,超过了就自动 kill 掉,然后 cluster 会重启它。

@alsotang 然道是用

setInterval(function() {
    process.memoryUsage();
},1000*10)

这样检查么?

@alsotang 这样做啊,不是从代码级别来整啊

@jerrywu55 对。。

@soliury 有个项目前途未卜。。就先撑着。。

web这样还可以,如果是tcp server 没得随便重启。。。。就。。

应该不至于吧,我前段时间测我们自己产品的server,带复杂的逻辑,一般测试几万次都不会出现内存泄露啊。我觉得你这个可能是测试次数太少,v8没有回收吧,你写个脚本跑几万次再试试看呢。

没有把你的服务器宕掉前,都不算内存泄露,大惊小怪。内核跟系统调用本身也是有内部缓冲区不停填入刷走的。

V8回收机制,不是对象过了其作用域就回收,而是要等到进程占用的内存资源达到某个上限才开始,垃圾回收时会导致任何脚本的挂起,因此,请不要手动gc(),内存泄漏什么的,赞成 @tulayang 的说法,没有因为OOM导致服务宕掉都别管它,性能测试组提交问题了再说,实在找不到来不及改,在不是很频繁发生的情况下,自杀重启也不错。

@zlbbq 嗯,这么一说 豁然开朗了,不然我非要钻这个牛角尖了。。。。O(∩_∩)O谢谢

@zlbbq hh.png

我的线上服务器状况,内存慢慢在增加。。。

你可以在pm2的项目配置文件中使用 max_memory_restart 这个选项,在内存超过某个阈值的时候会自动重启实例但是这种是治标不治本的方法哈哈~~

回到顶部