nodejs内存溢出 FATAL ERROR: CALL_AND_RETRY_0 Allocation failed – process out of memory
spa项目整体迁移转为ssr后,改动之后部署一切还好,就是突然有一天访问人数太多,node进程很容易就挂了自动重启。
最后经过压力测试,考虑到是堆内存溢出的问题,就报错误:FATAL ERROR: CALL_AND_RETRY_0 Allocation failed – process out of memory
1、复现结果:
采用Jmeter做压力测试,1s50次,持续请求,观察node进程占用内存情况
经过观察发现持续请求,node进程占用内存一直升高,最后达到1.4G左右,就不会再升,因为64位系统默认分配给node进程的上线就是1.4G,32位系统好像是0.7G。
达到1.4G之后,持续1/2分钟左右,进程就挂,报错堆内存溢出:FATAL ERROR: CALL_AND_RETRY_0 Allocation failed – process out of memory
2、解决过程
起初一直不知道原因,由于之前一直有上篇报错:connect ECONNREFUSED 127.0.0.1:80错误解决,的问题,所以刚开始以为是这个拒绝导致大量连接堆积导致,所以先解决了上述问题。
但是解决了上述问题之后,依然没有用,还是会报错。考虑到是页面的问题,所以换了一个纯静态页面请求,看是否因为页面代码的问题导致内存溢出,结果请求纯静态页面也是一样情况,这就不知道什么原因了。
注意:其实这时候应该考虑到往上一层,去层层筛选,应该考虑进页面之前会有那些处理,比如nuxt里plugins,进页面之前就需要实例化这些东西。应该去考虑这些处理里面会不会导致内存泄漏。
而我当时就是没有考虑到这一层,所以陷入了处理问题的盲区,只能考虑到使用工具去查询内存快照,然后再找那些地方出现内存泄漏点。
后来考虑到上一层,所以就往plugins里去找,发现的确有内存泄漏的点,同样是因为整体迁移ssr,不是从0到1搭建重构,所以代码结构没有过多注意。我发现全局拦截器是引入的三方axios,那么每次拦截都会引入一次,导致大量的引用占用资源。问题找到,改掉之后,改为引用同一个三方资源,就没有问题了。然后把所有plugins里重复引用的资源都改为同一份引用,这样也可以减少一部分占用。
改好之后,build,然后用Jmeter做压测,监控了100多万次样本检测,异常率很低0.1%,并且node进程不会上升了,占用内存稳定在200-250M之间,问题得到解决。
记录一下主要是为了复盘一下解决问题的思路,因为解决问题的思路比解决问题的方法更重要:应该是从底层往上层,层层筛选,底层没问题,应该考虑紧邻它的上一层会不会有问题,这样就能快速定位,而我就是因为没有继续往上考虑一层,所以导致走了不少弯路。
nodejs内存溢出 FATAL ERROR: CALL_AND_RETRY_0 Allocation failed – process out of memory的更多相关文章
- egret编译 FATAL ERROR: CALL_AND_RETRY_0 Allocation failed process out of memory解决
egret 白鹭编译时异常提示: FATAL ERROR: CALL_AND_RETRY_0 Allocation failed process out of memory. 编译时内存溢出, 因为 ...
- angular4 JavaScript内存溢出问题 (FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory)
最近在写基于angular4的项目的时候,在build --prod的时候,突然措手不及的蹦出个报错,大致错误如下: 70% building modules 1345/1345 modules 0 ...
- 【nodejs】FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
当使用大批量(>100)的SQL进行MySql数据库插值任务时,会发生以下错误: 总计将有371579条数据将被插入数据库 开始插入DB <--- Last few GCs ---> ...
- 解决 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 问题
https://blog.csdn.net/weixin_41196185/article/details/81114226 今天在启动vue项目的时候报了这样一个错误 观察到关键词是 FATAL E ...
- FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
vue项目 npm run dev 报错 WAIT Compiling...16:36:21 95% emittingFATAL ERROR: CALL_AND_RETRY_LAST Allocati ...
- node 打包内存溢出 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
electron-vue加载了地图 openLayer后,打包就包内存溢出 解决办法: "build": "node --max_old_space_size=4096 ...
- Angular JavaScript内存溢出问题 (FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory)
方法一和方法二参考:https://www.cnblogs.com/liugang-vip/p/6857595.html 方法一:my-project/node_modules/.bin 下增大内存( ...
- nodejs内存溢出
npm-v 报错,错误信息如下: FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScri ...
- 解决 VUE项目过大nodejs内存溢出问题
今天在启动vue项目的时候报了这样一个错误, 如图所示:频繁出现此种情况,项目太大,导致内存溢出,排除代码问题外,可参照以下方式解决 // 全局安装increase-memory-limit npm ...
随机推荐
- eclipse卡在revert resources的解决方法
遇到Eclipse卡在Revert Resources进程的问题,等又等不到它执行完毕(进度一直是0%),取消又是石沉大海一样毫无动静.更气人的是这个进程阻塞了其他所有的进程,什么操作都做不了.真是苦 ...
- 百度前端技术学院task1 总结
1.居中:当使用text-align或者vatical-align无法达到居中的时候,如果知道元素的大小,可以采用先设为left或right为50%,再设置margin-left或者margin-ri ...
- springBoot获取@NotBlank,@NotNull注解的message信息
概述 springBoot后台验证接收的参数是否不合法时,会抛出一个BlndException异常,获取message的自定义信息并返回 验证 UserEntity类 @Data @Entity @T ...
- instr函数的用法
1.定义 instr函数返回要截取的字符串在源字符串中的位置 语法如下: instr( string1, string2 [, start_position [, nth_appearance ] ...
- 关于SQL server事务
- Asp.net MVC企业级开发(04)---SignalR消息推送
Asp.net SignalR是微软为实现实时通信而开发的一个类库.可以适用于以下场景: 聊天室,如在线客服系统,IM系统等 股票价格实时更新 消息的推送服务 游戏中人物位置的实时推送 SignalR ...
- 4-rocketmq 发送时异常:system busy 和 broker busy 解决方案
原文:https://www.cnblogs.com/enenen/p/10138511.html 推荐阅读:https://juejin.im/post/5d996285f265da5bad4052 ...
- response.Close、response.End、response.Flush区别(下载文件)
今天在做文件下载功能用到的是response的方法,首先我们要了解这些方法的作用. 1.response.write():将信息写入http响应输出流. 2.response.Flush:向客户端发送 ...
- 浅谈Vue.js2.0核心思想
Vue.js是一个提供MVVM数据双向绑定的库,专注于UI层面,核心思想是:数据驱动.组件系统. 数据驱动: Vue.js数据观测原理在技术实现上,利用的是ES5Object.defineProper ...
- JavaScript中数组相关的属性方法
下面的这些方法会改变调用它们的对象自身的值: Array.prototype.copyWithin() 在数组内部,将一段元素序列拷贝到另一段元素序列上,覆盖原有的值. Array.prototype ...