一、现象

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 内存溢出问题分析定位相关推荐

  1. JAVA内存分析:基于dump内存溢出快照分析

    JAVA内存分析 JAVA内存分析一:基于dump内存溢出快照分析 JAVA内存分析二:idea集成jprofiler查看JVM内存使用情况 JAVA内存分析三:使用JDK自带工具进行内存和CPU分析 ...

  2. 生产环境 JVM 内存溢出案例分析

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/prestigeding ...

  3. 记一次内存溢出的分析经历

    作者:Janti https://www.cnblogs.com/superfj/p/8474288.html 说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机 ...

  4. 记一次内存溢出的分析经历——使用thrift

    背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务端(客户端的数量还是比较多的,正常的有几千个), 服务端用Java写的(带管理页面),属于RPC模式,中间的 ...

  5. 生产环境JVM内存溢出案例分析

    如果我们所在公司的业务量比较大,在生产环境经常会出现JVM内存溢出的现象,那我们该如何快速响应,快速定位,快速恢复问题呢? 本文将通过一个线上环境JVM内存溢出的案例向大家介绍一下处理思路与分析方法. ...

  6. 生产环境JVM内存溢出案例分析!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:Nginx 为什么快到根本停不下来? 个人原创100W+访问量博客:点击前往,查看更多 来源:blog.csdn ...

  7. java模拟内存溢出并分析_模拟内存溢出通过MAT分析

    构建一个简单的Springboot应用,模拟出OOM场景,再导出heap dump文件,通过Mat分析. 搭建简易Springboot,模拟OOM场景 搭建一个简易的springboot工程,在con ...

  8. 内存溢出————举例分析dump下的hprof文件

    第一步:下载分析工具 内存溢出分析工具:Eclipse Memory Analyzer 下载地址:http://www.eclipse.org/mat/downloads.php 第二步:开始分析hp ...

  9. 关于 android oom(内存溢出的分析)

    laozhu1124 android oom 全解析 Android oom 有时出现很频繁,这一般不是Android设计的问题,一般是我们的问题. 就我的经验而言,出现oom,无非主要是以下几个方面 ...

  10. Java常见内存溢出异常分析

    Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其中持久带实现了规范中规定的方法区,而 ...

最新文章

  1. python连接oracle数据库_Python连接oracle数据库 例子一
  2. 46 定时任务模块APScheduler
  3. nasm汇编:段的申明、$$、$
  4. Java基础教程:面向对象编程[2]
  5. 大萧条来临前的几大征兆
  6. 洛谷 P1054 等价表达式
  7. 一个火车上遇到的女孩所引发的联想
  8. SMB扫描-Server Message Block 协议、nmap
  9. 谷歌chromeos_闲置电脑也能焕发第二春?试试谷歌 Chrome OS 操作系统
  10. 云盘+Git GUI实现云盘文件版本控制
  11. Linux系统查看设备温度,技巧分享 Linux下查看cpu温度
  12. oracle ebs ar 表,EBS AR 模块常用表
  13. jquery 实现背景图片循环切换,显示隐藏div
  14. STM32CubeMX入门使用一
  15. 安卓手机通过OTG转接头连接U盘(USB口)相关问题解决
  16. matlab中simulink和flightgear联合仿真
  17. 达梦数据库SQL日志分析工具Dmlog的使用
  18. Flutter40.Opensource China Find界面跳转开源众包界面webview(12)
  19. 注册申请企业邮箱后如何使用,企业邮箱有已读回执功能吗?
  20. Tomcat 配置用户认证服务供C#客户端调用

热门文章

  1. 与英语密切联系的计算机专业,计算机专业英语
  2. 程序猿们,面对诱惑,你能hold住吗?
  3. 软考高级系统架构设计师系列论文二十五:论信息系统的安全性与保密性设计
  4. _itemmod_enchant_groups
  5. JAVA结构化处理开源库SPL
  6. 代码查重——LCS、Levenshtein距离、Jaro-Whinkle距离和变量代换
  7. Python实例——国际标准书号(ISBN)的计算
  8. 大学往事 第五章 计算机班的女生
  9. 学计算机u盘多少g合适,U盘设定分配单元的大小多少合适
  10. wps中加入代码块样式_样式图块的概述以及为什么要在设计过程中开始实施它们...