express 内存溢出问题分析定位
一、现象
1. 如下报错
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory1: node::Abort() [/usr/local/bin/node] 2: node::OnFatalError(char const*, char const*) [/usr/local/bin/node] 3: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/local/bin/node] 4: v8::internal::Factory::NewFixedArray(int, v8::internal::PretenureFlag) [/usr/local/bin/node] 5: v8::internal::OrderedHashTable<v8::internal::OrderedHashMap, 2>::Rehash(v8::internal::Handle<v8::internal::OrderedHashMap>, int) [/usr/local/bin/node] 6: v8::internal::Runtime_MapGrow(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/local/bin/node] 7: 0x2ecd2d1042fd 8: 0x2ecd2d1b251e
2.在linux服务器上输入top命令,发现该进程memery占用居高不下。
二、内存泄漏介绍
由上述问题可以确认,该node服务内存泄露. Node.js 进程的内存管理,都是有 V8 自动处理的,包括内存分配和释放。那么 V8 什么时候会将内存释放呢?
在 V8 内部,会为程序中的所有变量构建一个图,来表示变量间的关联关系,当变量从根节点无法触达时,就意味着这个变量不会再被使用了,就是可以回收的了。 而这个回收是一个过程性的,从快速 GC 到 最后的 Full GC,是需要一段时间的。 另外,Full GC 是有触发阈值的,所以可能会出现内存长期占用在一个高值,也可以算是一种内存泄漏,可以从《一次 Node.js 应用内存暴涨分析》中找到例子。还有一种就是引用不释放,导致无法进入 GC 环节,并且一直产生新的占用,这一般会发生在 Javascript 层面。
所以,定位内存泄漏问题,一般方案就是找那些不被使用又不会被释放的变量,处理了这些变量,问题一般就可以解决了。如果是 Node.js 底层变量不释放,除了提交 issue 等待解决外,只能通过优化启动参数来解决。
三、问题定位
1、看代码,代码里面是否存在闭包或者变量声明或者引用不当的地方。
2、是否引用node-canvas 或者echart等大型消耗cpu内存资源等依赖包
3、借助工具来分析,比如heapdump + chrome浏览器 memery分析工具
四、问题修复以heapdump为例,分析并修复内存泄漏的问题(基于express项目)。
1、项目根目录下安装heapdump
// node version > v0.8
npm install heapdump// Or, if you are running node.js v0.6 or v0.8: npm install heapdump@0.1.0
2、入口文件引入这个heapdump
// express中,在app.js中加入
const heapdump = require('heapdump');
3、重启该express服务,top(mac 上通过 top -pid xxx 查看) 命令查看linux占用情况:,
并发起少数几次请求后,输入如下命令,生成heap快照文件,记作name1
kill -USR2 <pid>
4、模拟批量服务请求
由于我这个是可以提供给web调用的接口,因此用一个抓包工具charles(或者其他模拟请求工具都行),重复发1000次请求,在用top命令查看该进程memery占用情况。发现问题可以重现了。同时输入如下命令:
// in UNIX platforms
kill -USR2 <pid>
// 执行上述命令,会生成一下heap快照的文件,记作name2
5、拷贝name1、name2文件到本地,并在chrome浏览器中打开分析;
6 、经过上述对比分析,可以得知代码存在的问题,然后作出相关优化。
比如,我这里是用到了node-canvas 和 Echart,最后发现这两个对象引用后一直没有内内存回收,导致内存溢出。代码层面做如下优化:
stage.destroy();chart.dispose();chart = null;stage = null;
然后,启动服务,模拟1000次请求,结果发现内存占用比之前少了很多,基本上不会出现内存溢出的问题了。
转载于:https://www.cnblogs.com/ldld/p/10670638.html
express 内存溢出问题分析定位相关推荐
- JAVA内存分析:基于dump内存溢出快照分析
JAVA内存分析 JAVA内存分析一:基于dump内存溢出快照分析 JAVA内存分析二:idea集成jprofiler查看JVM内存使用情况 JAVA内存分析三:使用JDK自带工具进行内存和CPU分析 ...
- 生产环境 JVM 内存溢出案例分析
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/prestigeding ...
- 记一次内存溢出的分析经历
作者:Janti https://www.cnblogs.com/superfj/p/8474288.html 说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机 ...
- 记一次内存溢出的分析经历——使用thrift
背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务端(客户端的数量还是比较多的,正常的有几千个), 服务端用Java写的(带管理页面),属于RPC模式,中间的 ...
- 生产环境JVM内存溢出案例分析
如果我们所在公司的业务量比较大,在生产环境经常会出现JVM内存溢出的现象,那我们该如何快速响应,快速定位,快速恢复问题呢? 本文将通过一个线上环境JVM内存溢出的案例向大家介绍一下处理思路与分析方法. ...
- 生产环境JVM内存溢出案例分析!
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:Nginx 为什么快到根本停不下来? 个人原创100W+访问量博客:点击前往,查看更多 来源:blog.csdn ...
- java模拟内存溢出并分析_模拟内存溢出通过MAT分析
构建一个简单的Springboot应用,模拟出OOM场景,再导出heap dump文件,通过Mat分析. 搭建简易Springboot,模拟OOM场景 搭建一个简易的springboot工程,在con ...
- 内存溢出————举例分析dump下的hprof文件
第一步:下载分析工具 内存溢出分析工具:Eclipse Memory Analyzer 下载地址:http://www.eclipse.org/mat/downloads.php 第二步:开始分析hp ...
- 关于 android oom(内存溢出的分析)
laozhu1124 android oom 全解析 Android oom 有时出现很频繁,这一般不是Android设计的问题,一般是我们的问题. 就我的经验而言,出现oom,无非主要是以下几个方面 ...
- Java常见内存溢出异常分析
Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其中持久带实现了规范中规定的方法区,而 ...
最新文章
- python连接oracle数据库_Python连接oracle数据库 例子一
- 46 定时任务模块APScheduler
- nasm汇编:段的申明、$$、$
- Java基础教程:面向对象编程[2]
- 大萧条来临前的几大征兆
- 洛谷 P1054 等价表达式
- 一个火车上遇到的女孩所引发的联想
- SMB扫描-Server Message Block 协议、nmap
- 谷歌chromeos_闲置电脑也能焕发第二春?试试谷歌 Chrome OS 操作系统
- 云盘+Git GUI实现云盘文件版本控制
- Linux系统查看设备温度,技巧分享 Linux下查看cpu温度
- oracle ebs ar 表,EBS AR 模块常用表
- jquery 实现背景图片循环切换,显示隐藏div
- STM32CubeMX入门使用一
- 安卓手机通过OTG转接头连接U盘(USB口)相关问题解决
- matlab中simulink和flightgear联合仿真
- 达梦数据库SQL日志分析工具Dmlog的使用
- Flutter40.Opensource China Find界面跳转开源众包界面webview(12)
- 注册申请企业邮箱后如何使用,企业邮箱有已读回执功能吗?
- Tomcat 配置用户认证服务供C#客户端调用
热门文章
- 与英语密切联系的计算机专业,计算机专业英语
- 程序猿们,面对诱惑,你能hold住吗?
- 软考高级系统架构设计师系列论文二十五:论信息系统的安全性与保密性设计
- _itemmod_enchant_groups
- JAVA结构化处理开源库SPL
- 代码查重——LCS、Levenshtein距离、Jaro-Whinkle距离和变量代换
- Python实例——国际标准书号(ISBN)的计算
- 大学往事 第五章 计算机班的女生
- 学计算机u盘多少g合适,U盘设定分配单元的大小多少合适
- wps中加入代码块样式_样式图块的概述以及为什么要在设计过程中开始实施它们...