位置: 编程技术 - 正文

浅析Node.js中的内存泄漏问题(node.js详解)

编辑:rootadmin

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

文章相关热门搜索词:node.js的理解,node.js详解,node .js,nodejs总结,node.js deno,node.js有什么作用,node.js的理解,node.js有什么作用,内容如对您有帮助,希望把文章链接给更多的朋友!

这篇文章是由Mozilla的Identity团队带来的 A Node.JS Holiday Season系列文章的首篇,该团队上个月发布了 Persona的第一个测试版本。在开发Persona时我们构建了一系列的工具,包括了从调试,到本地化,到依赖管理以及更多的方面。在这一系列的文章中我们将与社区分享我们的经验和这些工具,这对任何想用node.js建立一个高可用性服务的人都很有用。我们希望您能喜欢这些文章,并期待看到您的想法和贡献。

我们将从一篇关于Node.js的实质性问题:内存泄漏的主题文章开始。我们会介绍 node-memwatch — 一个帮助发现并隔离Node中的内存泄漏问题的函数库。

为什么自寻烦恼?

关于追踪内存泄漏问得最多的问题就是,“为什么要自寻烦恼?”。难道没有更紧迫的问题需要先解决吗?为什么不选择不时地重启服务,或为之分配更多的RAM?为了回答这些问题,我们提出了以下三点建议:

1.也许你不在乎不断增长的内存占用,但V8在乎(V8是Node运行时的引擎)。随着内存泄漏的增长,V8对垃圾收集器越来越具有攻击性,这会使你的应用运行速度变慢。所以,在Node上,内存泄漏会损害程序性能。

2.内存泄漏可能触发其他类型的失败。内存泄漏的代码可能会持续的引用有限的资源。你可能会耗尽文件描述符;你还可能会突然不能建立新的数据库连接。这类问题可能在你的应用耗尽内存前很早就会暴露出来,但它仍然会是你陷入困境。

3.最后,你的应用迟早会崩溃,并且在你的应用受到欢迎时肯定会发生。所有人都会在Hacker News上嘲笑你,讽刺你,这样你就悲剧了。

溃千里之堤的蚁穴在哪里?

在构建复杂应用的时候,很多地方都可能发生内存泄露。 闭包可能是最广为人知也是最声名狼藉的。因为闭包保留了对其作用域内的东西的引用,而这正是通常的内存泄露之源。

闭包泄露往往只有在有人去寻找它们的时候才能发现。但是在Node的异步世界里,我们随时随地的通过回调函数不停的生成闭包。如果这些回调函数没有在创建后立刻使用,分配的内存就会持续增长,那些看起来没有内存泄露问题的代码也会产生泄露。而这种问题更难发现。

你的应用也可能由于上游代码的问题导致内存泄露。也许你能定位到出现内存泄露的代码,但是你可能只能眼巴巴地盯着你那完美无缺的代码然后困惑于这到底是怎么泄露的!

正是这些难以定位的内存泄露促使我们想要一个node-memwatch这样的工具。传说几个月以前,我们的Lloyd Hilaiel把他自己锁在一个小房间里两天,试着追踪一个在压力测试下变得非常明显的内存泄露问题。(顺便说下,尽请期待Lloyd即将到来的关于负荷测试的文章)

经过两天的努力,他终于发现了Node内核中的元凶:http.ClientRequest中的事件监听器没有被释放。(最终修复这个问题的补丁只有两个但却至关重要的字母)。正是这次痛苦的经历促使Lloyd想要写一个能够帮助查找内存泄露的工具。

内存泄露定位工具

现在已经有许多好用且不断增强的工具用于定位Node.js应用的内存泄露。下面是其中的一些:

Jimb Esser的node-mtrace,它使用了GCC的mtrace工具来分析堆的使用。 Dave Pacheco的node-heap-dump对V8的堆抓取了一张快照并把所有的东西序列化进一个巨大的JSON文件。它还包含了一些分析研究快照结果的JavaScript工具。 Danny Coates的v8-profiler和node-inspector提供了绑定在Node中的V8分析器和一个基于WebKit Web Inspector的debug界面。 Felix Gnass的未禁用保持器图表分支。 Felix Geisendorfer的Node内存泄露指导(Node Memory Leak Tutorial)是一个又短又酷的v8-profiler和node-debugger使用教程。同时也是目前最先进的Node.js内存泄露调试技术指南。 Joyent的SmartOS平台,它提供了大量用于调试Node.js内存泄露的工具。

上面的这些工具我们都很喜欢,但是没有一个适用于我们的场景。Web Inspector对于开发中的应用非常棒,但是很难用于热部署的场景,尤其是在多服务器和涉及子进程的时候。同样的,在长时间高负载运行中出现的内存泄露也很难复现。像dtrace和libumem这样的工具虽然让人印象深刻,但是不是所有的操作系统都能用。

Enternode-memwatch

浅析Node.js中的内存泄漏问题(node.js详解)

我们需要一个跨平台的调试库,当我们的程序可能存在内存泄漏时,它不需要设备告诉我们,并且会帮我们找到哪里存在泄漏。所以我们实现了node-memwatch。

它给我们提供三件东西:

一个‘泄漏'事件发射器

一个‘状态事件发射器

一个堆内存区分类

并且还有一个在测试时很有用处的,可以触发垃圾收集器的功能。好吧,一共四点。

memwatch.on('stats', ...): Post-GC堆统计

node-memwatch能够在任何一个JS对象分配之前,紧随着一次完整的垃圾回收和内存压缩发出一个内存使用样本。(它使用了V8的post-gc钩子,V8::AddGCEpilogueCallback,来在每次垃圾回收触发时收集堆使用信息)

统计数据包括:

usage_trend(使用趋势) current_base(当前基数) estimated_base(预期基数) num_full_gc (完整的垃圾回收次数) num_inc_gc (增长的垃圾回收次数) heap_compactions (内存压缩次数) min (最小) max (最大)

这里有一个展示存在内存泄露的应用的数据看起来是什么样的例子。下面的图表随着时间追踪内存的使用。疯狂的绿线展示了process.memoryUsage()报告的内容。红线展示了node_memwatch报告的current_base。左下侧的盒子展示了附加信息。

注意Incr GCs非常高。那说明V8在拼命的尝试清理内存。

memwatch.on('leak', ...): 堆分配趋势

我们定义了一个简单的侦测算法来提醒你应用程序可能存在内存泄漏。即如果经过连续五次GC,内存仍被持续分配而没有得到释放,node-memwatch就会发出一个leak事件。事件的具体信息格式是明了易读的,就像这样:

memwatch.HeapDiff(): 查找泄漏元凶

最后,node-memwatch能比较堆上对象的名称和分配数量的快照,其对比前后的差异可以帮助找出导致内存泄漏的元凶。

对比产生的内容就像这样:

HeapDiff方法在进行数据采样前会先进行一次完整的垃圾回收,以使得到的数据不会充满太多无用的信息。memwatch的事件处理会忽略掉由HeapDiff触发的垃圾回收事件,所以在stats事件的监听回调函数中你可以安全地调用HeapDiff方法。

浅析Node.js中使用依赖注入的相关问题及解决方法 最近,我转向使用依赖注入来帮助理解分离代码的简单途径,并有助测试。然而,Node.js中的模块依赖Node提供的系统API,这很难判断私有依赖被恰当的使

在Mac OS下使用Node.js的简单教程 这里有一篇很好的Node.js介绍文章greatnodejsintro,它将给你一个非常方便的介绍Node.js和CouchDB,并给出一个实例实现REST的服务用于执行书签的CRUD操作,使

在Node.js应用中使用Redis的方法简介 在开始本文之前请确保安装好Redis和Node.js以及Node.js的Redis扩展——node_redis首先创建一个新文件夹并新建文本文件app.js文件内容如下:varredis=require("redis")

标签: node.js详解

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

上一篇:Node.js编程中客户端Session的使用详解(node.js详解)

下一篇:浅析Node.js中使用依赖注入的相关问题及解决方法(node.js使用教程)

  • 小规模缴纳增值税
  • 人力资源公司怎么和企业谈合作
  • 房地产企业什么时候开具正式发票
  • 企业所得税不得扣除的税金
  • 驾驶培训 增值税
  • 简易计税差额抵扣
  • 电力工程服务费计入什么科目
  • 年末暂估下年怎么入账
  • 重分类八个对应科目有哪些
  • 政府专项补助资金需要交所得税吗
  • 去新成立的公司
  • 税收专用缴款书
  • 转登记小规模纳税人转让固定资产
  • 石油天然气管道保护法
  • 测绘费能否在土地出让
  • 项目所在地怎么填
  • 计提租金分录怎么处理
  • 分包挂靠认定依据
  • 年终奖和当月工资合并申报税
  • 未足额代扣代缴车船税
  • 增值税普通发票可以抵扣吗
  • 高新技术企业研发费
  • 冲红的电子发票要怎么处理
  • 增值税发票如何读入金税盘
  • 财税2009年59号解读
  • 消费税的征收范围
  • 工商年报纳税总额是应缴还是实缴
  • 印花税资金账簿税率
  • 工会经费申报表的应税项应该怎样填写
  • 计提应收票据利息怎么算
  • 新成立的有限公司
  • 共享文档无法访问如何解决
  • 运行项目报错Couldn't import Django
  • 建筑业主营业务成本包括哪些
  • dll进程
  • win7旗舰版系统怎么样
  • 无形资产研发成功后的支出
  • 湘菜尖椒炒肉的做法
  • php连接mysql数据库的几种方式及区别
  • Symfony2 session用法实例分析
  • 增值税申报表上期留抵税额怎么填
  • 购车的进项税怎么抵扣
  • 少数股东权益贷方表示什么意思
  • python中map和filter有啥区别
  • 预存电费余额怎么突然多了
  • 软件开发公司如何保护源码
  • 约当产量法的含义
  • 分公司开票总公司收款怎么做账
  • 印花税怎么交税率是多少
  • 异地项目增值税要异地缴纳吗
  • win7系统安装教程不用u盘
  • 小规模纳税人企业所得税优惠政策最新2023
  • 外聘专家机票能抵扣增值税吗
  • 社保里面的住房公积金买房可以便宜多少
  • 营业执照变更法人需要本人去吗
  • 大家怎么看理想这个牌子
  • 营改增后出售土地如何缴纳增值税
  • 合伙企业分红怎么做账
  • 公司自己搭建的房子出租可以按投资性房地产吗
  • 电费发票开据后如何入帐?
  • 外出参加会议费用怎么做账
  • 委托加工产品送货合同
  • 营业收入包括哪些内容?
  • 仓库周转率是什么意思
  • centos vsftpd配置
  • Windows Server 2016怎么安装?Windows Server 2016安装、激活、设置详细图文教程
  • windows7用户
  • bios设置第一启动项图解
  • 电脑桌面图标有虚影怎么回事
  • win10 win8.1双系统
  • 联想笔记本出厂编号
  • 双击windows 7桌面上的快捷图标可以干嘛
  • win10ipv4 ipv6无internet访问权限
  • nodejs中art-template模板语法的引入及冲突解决方案
  • js 和html
  • windows批量添加文件后缀
  • 数据库的基本操作语句有哪些
  • shell 查找最新文件
  • 贵阳国家高新技术产业开发区管理委员会
  • 长沙市各个区的县市排名
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设