nodejs 第三方库不能乱用

最近搞两个项目,都是使用了nodejs,作网站抓取和服务。

结果发现跑一阵子后,内存占用居高不下,一直没在意,然后项目里用到了excel导入,用了node-xlsx库,结果,1万多条数据一导入,内存就占了1.5个G,而且无法释放,两次一导,系统卡死。

找原因找了一个星期,先是怀疑asyc有问题,但是想想也不对,纯js的,怎么可能内存泄漏,然后怀疑 node-xlsx,没有找到原因,甚至怀疑nodejs本身的GC问题,网上找了N久,无果。


实在没办法,使用内存查看工具  node-memwatch,报告疑似内存泄漏,

{ start: Fri, 29 Jun 2014 14:12:13 GMT,
  end: Fri, 29 Jun 2014 14:12:33 GMT,
  growth: 67984,
  reason: 'heap growth over 5 consecutive GCs (20s) - 11.67 mb/hr' }

但是始终不知道是什么地方导致的。

搜寻了很久,发现了这个工具webkit-devtools-agent,主页地址:https://github.com/c4milo/node-webkit-agent,然后使用它一查看,发现一半的cpu被trycatch以及domain给用了,突然想到我为了防止回调中的错误,所以使用了trycatch库作为错误捕捉,考虑到gc不能释放是因为变量被占用,怀疑是它干的。

删除所有的trycatch库及引用,再测试,一万多条数据导入,内存维持在100M左右,问题解决。


唉,第三方库,不能随便用啊,用了有坑就坑死人啊,差点把项目给黄了。


PS. 一堆回调,里面错误导致系统崩溃怎么办,不要想,乖乖用promise(Q)吧。

如果要逻辑处理怎么办?async-q非常好用。

 原始async在后台处理逻辑中,不建议使用,因为一旦错误,少调用了一个callback,然后你就发现系统没有按照你想像的工作,然后,什么反应和提示都没有,万一多了个callback呢?你就发现,什么地方莫名调用两次。


多年经验,nodejs 的神器  express + q +async-q ,基本满足逻辑管理的需求。

该死的async-q的例程太少了,被parallLimit搞了半天,回头有空把async-q的例程全部写上。

你可能感兴趣的:(nodejs 第三方库不能乱用)