解决一起go服务fatal error: runtime: out of memory案例

服务出现fatal error: runtime: out of memory报错,导致服务挂掉,下面分享一个已经碰到的一种案例。

情况如图:

图中只截取部分,业务代码暂不展示,经排查,出问题的代码所在行是这样的:abc = append(abc, obj)

abc是一个切片。相信你基本有眉目了,没错,就是因为切片过长导致内存不够用引起的,是多大长度呢,当时崩掉时的切片长度打出来是2400万左右,这个数字大家不要死记硬背,因为每台机器上这个值是不一样的,因为机器每时每刻也运行有其它任务,剩余可用的内存肯定一直在变化中,所以即使是相同业务相同执行方式的代码,也可能是不同的结果;

因此需要充分评估代码的执行方式和数据量级影响,避免因为占用空间过大而引起内存不足,解决方式推荐以下几种:

1,可改用并发,以channel不断接收,接收端收到即处理,而不是append成切片最后才一并处理;

2,若喜欢用slice则可根据业务来分析,比如业务中需要进行好几种任务,则可以不同的切片来处理不同的数据,最后遍历这几个切片就ok(即使是顺序遍历多个切片也是很快的), 只要使用得当用slice也不是不可以;

3,灵活运用代码,根据业务判断看看map是否能用进去,如果能用map则执行方式也能有所改变。

这些都是当时想出来的可用的办法,后来采用了第一种,能有效减少空间占用、很优雅的就能解决!

另外同步一点,像内存不足这种报错,用recover()来捕获panic是捕获不到的,写的defer里的信息不会打印出来,这次案例就是印证。

如果没有这次的事情,也了解不到这种情况的优化措施,分享出来大家共勉!

如果觉得有帮助欢迎评论~

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据引用[1]中提供的信息,当使用koa框架时,可能会遇到"FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory"的错误。这个错误通常是由于Node.js的内存泄漏导致的。下面是一些解决方法: 1. 增加Node.js的内存限制:可以通过在启动应用程序时使用`--max-old-space-size`标志来增加Node.js的内存限制。例如,`node --max-old-space-size=4096 app.js`将Node.js的内存限制增加到4GB。 2. 优化代码和资源:检查代码中是否存在内存泄漏的问题,例如未释放的资源、循环引用等。确保及时释放不再使用的对象和资源,以减少内存占用。 3. 使用流式处理:对于大型数据集或文件,可以使用流式处理而不是一次性加载到内存中。这可以通过使用适当的流式处理库或技术来实现,例如使用koa的`koa-bodyparser`中间件来处理请求体。 4. 使用缓存:对于频繁访问的数据,可以考虑使用缓存来减少对内存的需求。这可以通过使用适当的缓存库或技术来实现,例如使用Redis作为缓存服务器。 5. 升级Node.js版本:有时,内存泄漏问题可能是由于Node.js版本中的bug引起的。尝试升级到最新的稳定版本,以获得修复可能存在的问题的好处。 这些解决方法可以帮助您解决koa框架中的内存泄漏问题,并避免"FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory"错误的发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProblemTerminator

您的鼓励将是作者最大的动力哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值