node.js 内存泄露问题之解决

因项目需要,要借用node.js 作为 js引擎,解析动态生成的 js 语句,并将结果返回给调用者。因此,基于nodes.js ,实现了一个简单的 httpserver,针对请求,生成动态js 语句,然后使用 eval 执行之。

但是,问题来了。在某个项目中,大致一周多的时间,node.js 进程就会宕机一次,日志里报告以下信息:


<--- Last few GCs --->

[16056:0x434dab0] 2156292597 ms: Mark-sweep 1275.4 (1456.3) -> 1274.4 (1456.3) MB, 143.2 / 0.0 ms  (average mu = 0.135, current mu = 0.002) allocation failure GC in old space requested
[16056:0x434dab0] 2156292797 ms: Mark-sweep 1278.0 (1456.3) -> 1276.0 (1456.3) MB, 180.2 / 0.0 ms  (average mu = 0.115, current mu = 0.097) allocation failure GC in old space requested


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x1f36196841bd]
Security context: 0x4d7e551e6c9 <JSObject>
    1: test [0x4d7e550d3b9](this=0x239f406b0319 <JSRegExp <String[37]\: .*(\x7535\x8bdd|\x53f7\x7801|\x624b\x673a\x53f7).{0,3}\x6211.{0,2}((\x4e70|\x65b0\x529e)\x7684).*>>,0x239f406b10b1 <String[19]\: \x554a\x6211\x5df2\x7ecf\x5230\x4f60\x4eec\x8425\x4e1a\x5385\x4e5f\x529e\x8fc7\x4e86\x8425\x4e1a\x5385\x91cc\x9762>)
    2: checkScriptIsMultiLineRegExp(aka che...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

可知,是GC的时候失败了,内存超过了预设的 1456.3MB 的大小,因此程序抛出异常,罢工了。

翻阅资料可知,默认情况下 node.js 的内存设置大小为 1.4GB。

因此,要解决这个问题,看起来是比较简单的,即更改这个内存限制大小即可:

node --max_old_space_size=4096 ./httpserver.js

如上,添加启动选项,将内存调大即可。

但是,这样并不能彻底解决。如果内存泄露的情况存在,除非定期重启进程,早晚仍然要达到限制值,还是会宕机。

因此,还是必须要找到根本解决办法,防范内存泄露。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值