关于Node的内存泄漏简析

来源 :中国科技博览 | 被引量 : 0次 | 上传用户:ytdpg
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  [摘 要]Node对内存泄漏十分敏感,一旦线上应用有成千上万的流量,哪怕是一个字节的内存泄漏也会造成堆积,垃圾回收过程中将耗费更多时间进行对象扫描,应用响应缓慢,直到进程内存溢出,应用崩溃。本文不仅分析了造成内存泄漏的原因,并介绍了几种主流的排查方案。
  [关键词]Node 内存泄漏
  中图分类号:TG294 文献标识码:A 文章编号:1009-914X(2017)46-0046-01
  1 引言
  内存泄漏通常产生于无意间,较难排查。尽管内存泄漏的情况不尽相同,但其实质只有一个,那就是应当回收的对象出现意外而没有被回收,变成了常驻在老生代中的对象。
  2 引发内存泄漏的原因
  通常,造成内存泄漏的原因主要有两个:缓存,队列消费不及时。
  2.1 缓存
  缓存在应用中的作用举足轻重,可以十分有效地节省资源。因为它的访问效率要比I/O的效率高,一旦命中缓存,就可以节省一次I/O的时间。
  但是在Node中,缓存并非物美价廉。一旦一个对象被当作缓存来使用,那就意味着它将会常驻在老生代中。缓存中存储的键越多,长期存活的对象也就越多,这将导致垃圾回收在进行扫描和整理时,对这些对象做无用功。
  另一个问题在于,JavaScript开发者通常喜欢用对象的键值对来缓存东西,但这与严格意义上的缓存又有着区别,严格意义的缓存有着完善的过期策略,而普通对象的键值对并没有。所以,在Node中,任何试图拿内存当缓存的行为都应当被限制。当然,这种限制并不是不允许使用的意思,而是要小心为之。
  为了解决缓存中的对象永远无法释放的问题,需要加入一种策略来限制缓存的无限增长,例如将记录键记录在数组中,一旦超过数量,就以先进先出的方式进行淘汰,这种策略适合于小场景的案例中使用,在比较大型的应用场景一般使用的是基于LRU(最近最少使用)算法的策略。
  除了限制缓存的大小外,还需要考虑到进程间是无法共享内存的。如果在进程内使用缓存,这些缓存不可避免地有重复,对物理内存的使用是一种浪费。目前较好的解决方案是采用进程外的缓存,进程自身不存储状态。外部的缓存软件有着良好的缓存过期淘汰策略以及自身的内存管理,不影响Node进程的性能。市面是较好的缓存有Redis和Memcached。
  2.2 队列
  在解决了缓存带来的内存泄漏问题后,另一个不经意产生的内存泄漏则是队列。在JavaScript中可以通过队列(数组对象)来完成许多特殊的需求,比如Bagpipe。队列在消费者-生产者模型中经常充当中间产物。这是一个容易忽略的情况,因为在大多数应用场景下,消费的速度远远大于生产的速度,内存泄漏不易产生。但是一旦消费速度低于生产速度,将会形成堆积。
  举个例子,有的应用会收集日志。如果欠缺考虑,也许会采用数据库来记录日志。日志通常会是海量的,数据库构建在文件系统之上,写入效率远远低于文件直接写入,于是会形成数据库写入操作的堆积,而JavaScript中相关的作用域也不会得到释放,内存占用不会回落,从而出现内存泄漏。
  遇到这种场景,表层的解决方案是换用消费速度更高的技术。在日志收集的案例中,换用文件写入日志的方式会更高效。但是,如果生产速度因为某些原因突然激增,或者消费速度因为突然的系统故障而降低,内存泄漏还是可能会出现。
  深度的解决方案应该是监控队列的长度,一旦堆积,应当通过监控系统产生报警并通知相关人员。另一个解决方案是任意异步调用都应该包含超时机制,一旦在限定的时间内未完成响应,通过回调函数传递超时异常,使得任意异步调用的回调都具备可控的响应时间,给消费速度一个下限值。
  对于Bagpipe而言,它提供了超时模式和拒绝模式。启用超时模式时,调用加入到队列中就开始计时,超时就直接响应一个超时错误。启用拒绝模式,当队列拥塞时,新到来的调用会直接响应拥塞错误。这两种模式都能够有效地防止队列拥塞导致的内存泄漏问题。
  3 内存泄漏的排查方案
  在Node中,由于V8的堆内存大小的限制,它对内存泄漏非常敏感。当在线服务的请求量变大时,哪怕是一个字节的泄露都会导致内存占用过高。
  常见的用于排查Node应用内存泄露的有以下几个工具:
  *v8-profiler,用于对V8堆内存抓取快照和对CPU进行分析;
  *node-heapdump,允许对V8堆内存抓取快照,用于事后分析,這是Node核心贡献者编写的模块;
  *node-mtrace,它使用了GCC的mtrace工具来分析堆的使用;
  *node-memwatch,来自Mozilla的LloydHilaiel贡献的模块,采用WTFP许可发布。
  4 总结
  所谓知己知彼,百战不殆,只有深入了解了造成内存泄漏的主要原因,才能对症下药,尽可能地规避造成内存泄漏的行为,并采用主流的工具予以排查消除隐患。
其他文献
[摘 要]本文简要分析了水利水电工程中的灌浆施工技术,阐述了具体的灌浆方式,并提出了相应的质量控制方法,希望能够为相关行业提供一些借鉴,仅供参考。  [关键词]水利水电工程;灌浆施工技术;质量控制  中图分类号:TG134 文献标识码:A 文章编号:1009-914X(2017)46-0038-01  1 引言  水利水电工程中的灌浆施工,其主要施工方式是通过钻孔将浆液用机械灌入建筑物的结构内,经
期刊
[摘 要]杨村煤矿所采采区为13采区,于2017年2月中旬进入矿井回撤阶段,为提高物资回收率,避免回撤期间投入大量人力、物力、财力,造成投入与回收比例失调,因此在确保安全回撤的前提下,按照科学、经济的方式开展矿井回撤,优化成本管控。杨村煤矿结合矿井实际情况,开展了回撤物资鉴定及经济效益分析,保障矿井安全回撤。  [关键词]矿井回撤;回撤物资鉴定;经济效益分析  中图分类号:TG234 文献标识码:
期刊
[摘 要]伴随着我国的农村用电网络的不断建设以及改造工程的投入实施在农村有些配电网络的技术能力也有了很大程度的提高。事实证明,在农村配电网络想要取得长期的发展必须要有一个统一的标准对其进行约束与管理,这样才能够保证在农村有充足的电能供应,真正的满足供电系统的可靠性以及在运行欺间的经济性要求。  [关键词]农村用电网络;配电线路;预防措施  中图分类号:TG254 文献标识码:A 文章编号:1009
期刊
[摘 要]目前社会,供电系统表现为相对较高的复杂度,针对小同类型的供电系统有必要选择各异的检修措施各地具体在推行大检修模式的前提下,对于变电运维涉及到的班组管理进行了个面探究。为此,针对供电系统有必要开展个程性的供电检修,因地制宜推行运维班管理的新模式  [关键词]大检修模式;变电运维;班组管理;具体情况  中图分类号:TG942 文献标识码:A 文章编号:1009-914X(2017)46-00
期刊
[摘 要]近年来,随着重工业的深入发展,动力设备的体型也越来越大,其扰力引发的振动问题也越来越突出。大型汽轮机基础通常采用钢筋混凝土框架式结构。为了保证汽轮机长期、安全、稳定地工作,在汽轮机基础设计中需要进行振动分析,使基础振动满足GB50040—1996《动力机器基础设计规范》所规定的线位移控制条件。本文以某发电厂12MW汽轮机框架式混凝土基础为研究对象,采用STAAD.Pro软件对汽轮机基础进
期刊
[摘 要]随着智能电网建设在我国的如火如荼开展,电网规模日益扩大,若仍然只采用传统的输电线路巡视方式,很容易会由于巡视人员身心疲惫,造成巡视质量的不达标,最终影响到输电系统的安全稳定运行。无人机的应用能够更好的代替人力进行线路的巡视工作,而且能达到良好的巡视效果。不仅可以有效扩大巡视范围,提高巡视效率,而且也能够提高巡视的安全性,使输电线路巡视更加全面,更加的具有智能化和自动化。  [关键词]无人
期刊
[摘 要]农网改造结束后,各供电所作为县级供电企业的分支营业机构,承担着管辖区域内用电户的报装接电、抄表收费、营销管理、网络维护、安全管理等工作,地位举足轻重,各供电所面临着新的机遇和挑战。特别是在同网同价中取消了“赤脚电工”,组织机构定编定员,实施抄收到户、维护到人后,农村电网覆盖面的不断扩大,直接抄收用户的不断增多,24小时承诺服务责任的加大,都给供电所的安全管理带来新的压力,难度更大,责任更
期刊
[摘 要]供电企业电力营销管理的创新性,主要有改善营销策略,综合客户的需求转变,时代的进步以及企业的发展需求。因此简要探讨了现阶段供电企业电力营销管理的相关内容,阐述了供电企业电力营销和电力商品的相关概念,指出了供电企业电力营销管理工作中有待完善的地方,并针对供电企业电力营销管理提出了一些完善措施,以促进企业的顺利发展。  [关键词]电力营销,供电企业,管理机制,创新研究  中图分类号:TG354
期刊
[摘 要]在一辆商用汽车的设计初期,总布置设计是极为重要的,它不仅规定了整车的关键尺寸以及关键的零件结构,还能有效地控制整车的性能。在商用车的各种性能中,碰撞是一个关键的指标,这一指标对于关键部位的尺寸和零件的结构提出了更高的要求。这一指标保证汽车发生碰撞时,可以按照汽车以设定的方式进行碰撞,从而减少对于车身和车内人员的伤害。本文对于汽车总布置设计中碰撞设计的步骤进行讨论,分析了关键零件的控制策略
期刊
[摘 要]近几十年来,我国社会经济得到巨大发展,水利工程在国民经济中的建设比重日益增大,为了实现我国水资源的有效保护与开发利用,满足日益增长的人民生活和工农业生产发展需要的,我国相继兴建一批大中小型水利工程。其中,做好水利建设项目前期工作,对于保证项目建设的合法性、合理性、建设质量、使工程如期发挥效益具有重大作用。  [关键词]水利工程;前期工作;工程建设  中图分类号:TG154 文献标识码:A
期刊