位置: 编程技术 - 正文

nodeJs内存泄漏问题详解(node 内存泄漏)

编辑:rootadmin

推荐整理分享nodeJs内存泄漏问题详解(node 内存泄漏),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:node 内存泄漏,nodejs 内存溢出,node 内存泄漏,nodejs 内存,nodejs 内存溢出,node 内存泄漏,node内存泄漏及解决方法,node内存泄漏及解决方法,内容如对您有帮助,希望把文章链接给更多的朋友!

之前一次偶然机会发现,react 在server渲染时,当NODE_ENV != production时,会导致内存泄漏。具体issues: 。随着node,react同构等技术地广泛运用,node端内存泄漏等问题应该引起我们的重视。为什么node容易出现内存泄漏以及出现之后应该如何排查,下面通过一个简单的介绍以及例子来说明。

首先,node是基于v8引擎基础上,其内存管理方式与v8一致。下面简单介绍v8的相关内存特效。

V8内存限制

node基于V8构建,通过V8的方式进行分配跟管理js对象。V8对内存的使用有限制(老生代内存位系统下约为1.4G,位系统下约为0.7G,新生代内存位系统下约为MB,系统下约为MB)。在这样的限制下,将导致无法操作大内存对象。如果不小心触碰这个界限,就会造成进程退出。

原因:V8在执行垃圾回收时会阻塞JavaScript应用逻辑,直到垃圾回收结束再重新执行JavaScript应用逻辑,这种行为被称为“全停顿”(stop-the-world)。若V8的堆内存为1.5GB,V8做一次小的垃圾回收需要ms以上,做一次非增量式的垃圾回收甚至要1秒以上。

通过node --max-old-space-size=xxx(单位MB) , node --max-new-space-size=xxx(单位KB) 设置新生代内存以及老生代内存来破解默认的内存限制。

V8的堆构成

V8的堆其实并不只是由老生代和新生代两部分构成,可以将堆分为几个不同的区域:

新生代内存区:大多数的对象被分配在这里,这个区域很小但是垃圾回特别频繁 老生代指针区:属于老生代,这里包含了大多数可能存在指向其他对象的指针的对象,大多数从新生代晋升的对象会被移动到这里 老生代数据区:属于老生代,这里只保存原始数据对象,这些对象没有指向其他对象的指针 大对象区:这里存放体积超越其他区大小的对象,每个对象有自己的内存,垃圾回收其不会移动大对象 代码区:代码对象,也就是包含JIT之后指令的对象,会被分配在这里。唯一拥有执行权限的内存区 Cell区、属性Cell区、Map区:存放Cell、属性Cell和Map,每个区域都是存放相同大小的元素,结构简单

GC回收类型

增量式GC

表示垃圾回收器在扫描内存空间时是否收集(增加)垃圾并在扫描周期结束时清空垃圾。

非增量式GC

使用非增量式垃圾收集器时,一收集到垃圾即将其清空。

垃圾回收器只会针对新生代内存区、老生代指针区以及老生代数据区进行垃圾回收。对象首先进入占用空间较少的新生代内存。大部分对象会很快失效,非增量GC直接回收这些少量内存。假如有些对象一段时间内不能被回收,则进去老生代内存区。这个区域则执行不频繁的增量GC,且耗时较长。

那什么时候才会导致内存泄漏的发生呢?

内存泄漏的途径

内存泄露 缓存 队列消费不及时 作用域未释放

Node的内存构成主要是通过V8进行分配的部分和Node自行分配的部分。受V8的垃圾回收限制的主要是V8的堆内存。造成内存泄漏的主要原因:1,缓存;2,队列消费不及时;3,作用域未释放

内存泄漏分析

查看V8内存使用情况(单位byte)

ress:进程的常驻内存部分

heapTotal,heapUsed:V8堆内存信息

查看系统内存使用情况(单位byte)

nodeJs内存泄漏问题详解(node 内存泄漏)

os.totalmem()os.freemem()

返回系统总内存以及闲置内存

查看垃圾回收日志

node --trace_gc -e "var a = []; for( var i = 0; i < ; i++ ) { a.push(new Array()); }" >> gc.log //输出垃圾回收日志

node --prof //输出node执行时性能日志。 使用windows-tick.processor查看。

分析监控工具

v8-profiler 对v8堆内存抓取快照和对cpu进行分析node-heapdump 对v8堆内存抓取快照node-mtrace 分析堆栈使用node-memwatch 监听垃圾回收情况

node-memwatch

stats事件:每次进行全堆垃圾回收时,将触发一次stats事件。这个事件将会传递内存统计信息。

观察num_full_gc和num_inc_gc反映垃圾回收情况。

leak事件:如果经过连续5次垃圾回收后,内存仍然没有被释放,意味着内存泄漏的发生。这个时候会触发一个leak事件。

Heap Diffing 堆内存比较 排查内存溢出代码。下面,我们通过一个例子来演示如何排查定位内存泄漏:

首先我们创建一个导致内存泄漏的例子:

这里我们通过设置一个不断增加且不回被回收的数组,来模拟内存泄漏。

通过使用heap-dump模块来定时纪录内存快照,并通过chrome开发者工具profiles来导入快照,对比分析。

我们可以看到,在浏览器访问 localhost: ,并多次刷新后,快照的大小一直在增长,且即使不请求,也没有减小,说明已经发生了泄漏。

接着我们通过过chrome开发者工具profiles, 导入快照。通过设置comparison,对比初始快照,发送请求,平稳,再发送请求这3个阶段的内存快照。可以发现右侧new中LeakClass一直增加。在delta中始终为正数,说明并没有被回收。

小结

针对内存泄漏可以采用植入memwatch,或者定时上报process.memoryUsage内存使用率到monitor,并设置告警阀值进行监控。

当发现内存泄漏问题时,若允许情况下,可以在本地运行node-heapdump,使用定时生成内存快照。并把快照通过chrome Profiles分析泄漏原因。若无法本地调试,在测试服务器上使用v8-profiler输出内存快照比较分析json(需要代码侵入)。

需要考虑在什么情况下开启memwatch/heapdump。考虑heapdump的频度以免耗尽了CPU。 也可以考虑其他的方式来检测内存的增长,比如直接监控process.memoryUsage()。

当心误判,短暂的内存使用峰值表现得很像是内存泄漏。如果你的app突然要占用大量的CPU和内存,处理时间可能会跨越数个垃圾回收周期,那样的话memwatch很有可能将之误判为内存泄漏。但是,这种情况下,一旦你的app使用完这些资源,内存消耗就会降回正常的水平。所以需要注意的是持续报告的内存泄漏,而可以忽略一两次突发的警报。

node网页分段渲染详解 页面渲染,通常来说分为前端渲染以及后端渲染。前端渲染指的是服务端返回html框架以及模版,前端通过ajax异步请求拉取数据渲染模版,并动态修改dom

深入分析node.js的异步API和其局限性 用异步API的原因异步的概念之所以首先在Web2.0中火起来,是因为在浏览器中Javascript在单线程上执行,而且他还与UI渲染公用一个线程.这意味着Javascript在执

Node.js读写文件之批量替换图片的实现方法 问题:文件夹A中有大量图片文件,需要用另外一个图片替换掉A中图片,但是命名保持不变。手工的做法如下:1)浏览器打开图片-2)另存为-3)目标文

标签: node 内存泄漏

本文链接地址:https://www.jiuchutong.com/biancheng/370792.html 转载请保留说明!

上一篇:Node.js实现兼容IE789的文件上传进度条(nodejs edge)

下一篇:node网页分段渲染详解(node分页接口)

  • 不良资产处置措施
  • 个体工商户是对公账户还是个人账户
  • 资产处置收益对应科目
  • 房地产开发企业预收款预缴增值税
  • 城市维护建设税属于什么科目
  • 多交税款如何处罚
  • 实收资本转出怎么做账
  • 资产减值损失负数是好是坏
  • 公司预支了然后来报销的帐怎么做?
  • 房地产增值税预征率
  • 个人所得税违规怎么处理
  • 企业会主动对税吗
  • 公司单独买医保
  • 增值税专用发票可以开电子发票吗
  • 税务局代增值税专用发票盖什么章
  • 小规模税局代增值税专用发票怎么交税
  • 是不是所有的进口药都不能报销
  • 工会经费申报表的应税项应该怎样填写
  • 纳税所得额怎么算个税
  • 企业清算期间账务怎么做
  • 原材料和加工费能分着开票么
  • 缴纳印花税和残值的比例
  • 发工资扣的个人社保计入哪个科目
  • 餐饮发票可以计入什么费用
  • PHP:oci_field_size()的用法_Oracle函数
  • getcodebase
  • 本单位生产的水泥属于
  • 企业类型变更是什么意思
  • 前端 上传文件
  • 关于交易性金融资产的问题
  • php面向对象的三大特征
  • 简易计税办法和计税依据
  • 印花税减半征收优惠政策2020
  • 开票一定要对公户嘛
  • jquery和php
  • 广告代理费收取比例
  • css+html
  • 教你学python
  • python处理数据教程
  • 成本法变为权益法合并层面计算投资收益
  • 或有资产确认的前提为什么是
  • 企业提取盈余公积属于什么会计科目
  • 现金流动负债比率和流动比率一样吗
  • 怎么样去掉
  • 安装mysql5.1的步骤和方法
  • linux怎么创建python文件
  • 收入重复开票跨年了怎么处理
  • 零售药店可申请纳入医保定点
  • 销售收入未开票
  • 发行的企业债券计入什么科目
  • 快递收据能报销吗
  • 农产品普通发票进项税抵扣
  • 费用结转的方法有哪些
  • 受托加工的物资属于资产吗
  • 建筑业增值税是什么意思
  • 劳务报酬的增值税起征点
  • 待处理财产损益是什么类科目借贷方向
  • 可明确区分的商品什么意思
  • 利润表的所得税和所得税申报表所得税
  • 免费给人一些客户资料违法吗
  • 公司注销帐务怎么处理
  • 销项负数发票是红字发票吗
  • 留抵的进项税可以用多少年
  • 反记账是什么
  • Windows 10 与 MySQL 5.5 安装使用及免安装使用详细教程(图文)
  • 必应big
  • macbookair断网
  • WinMX.exe - WinMX是什么进程
  • linux如何安装rz和sz
  • js加载失败怎么办
  • 安卓的系统设置在哪
  • js行号显示的文字不一样
  • javascript教程推荐知乎
  • Android网络通讯哪个最简单
  • 国家税务总局全国增值税查询
  • 党日活动与专业建设结合
  • 沈阳市税务局最新公告
  • 上海市嘉定区税务局电话号码
  • 中国税务网官网1732171695993732.2418.61431871
  • 成都市地方税务局官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设