作家
登录

如何处理JavaScript内存泄露

作者: 来源: 2017-10-26 09:46:23 阅读 我要评论

沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!


几周前,我们开端写一个系列,深刻商量JavaScript和它的工作道理。我们认为懂得JavaScript的构成以及它们若何协作,有助于编写出更好的代码和应用法度榜样。

本系列第一篇重点介绍了引擎、运行时、调用栈。第二篇揭示了谷歌V8 JavaScript引擎的内部机制,并且供给了一些关于若何写出更好的JavaScript代码的建议。

本文作为第三篇,将会评论辩论另一个开辟者轻易忽视的重要主题 :内存治理。我们也会供给一些关于若何处理JavaScript内存泄漏的技能。在SessionStack,我们须要确保不会造成内存泄漏或者不会增长我们集成的Web应用的内存消费。

概述

某些说话,比如C有初级的原生内存治理原语,像malloc()和free()。开辟人员应用这些原语可以显式分派和释放操作体系的内存。

相对地,JavaScript会在创建变量(对象、字符串)时主动分派内存,并在这些变量不被应用时主动释放内存,这个过程被称为垃圾收受接收。这个“主动”释放资本的特点带来了很多困惑,让JavaScript(和其他高等级说话)开辟者误认为可以不关怀内存治理。这是一个很大年夜的缺点

即使应用高等级说话,开辟者也应当对于内存治理有必定的懂得(至少有根本的懂得)。有时主动内存治理存在一些问题(例如垃圾收受接收实现可能存在缺点或者不足),开辟者必须弄明白这些问题,以便找一个合适解决办法。

无论你用哪一种编程说话,内存生命周期几乎老是一样的:

Here is an overview of what happens at each step of the cycle: 这是对生命周期中的每一步大年夜概的解释:

  • 分派内存— 内存是被操作体系分派,这许可法度榜样应用它。在初级说话中(例如C),这是一个作为开辟者须要处理的显式操作。在高等说话中,然而,这些操作都代替开辟者进行了处理。
  • 应用内存。实际应用之前分派的内存,经由过程在代码操作变量对内涵进行读和写。
  • 释放内存 。不消的时刻,就可以释放内存,以便从新分派。与分派内存操作一样,释放内存在初级说话中也须要显式操作。

什么是内存

在直接商量Javascript中的内存之前,我们先扼要的评论辩论一下什么是内存、内存大年夜概是怎么样工作的。

内存生命周期

仁攀类不善于把我们所有的思惟和算术用位运算来表示,我们把这些小器械组织成一个大年夜家伙,这些大年夜家伙可以用来表示数字:8位是一个字节。字节之上是字(16位、32位)。

很多器械被存储在内存中:

  1. 所有的变量?专度榜样顶用到的数据;
  2. 法度榜样的代码,包含操作体系的代码。

当涉及DOM树内部或子节点时,须要推敲额外的┞峰酌身分。例如,你在JavaScript中保持对某个表的特定单位格的引用。有一天你决定大年夜DOM中移除表格然则保存了对单位格的引用。人们也许会认为除了单位格其他的都邑被收受接收。实际并不是如许的:单位格是表格的一个子节点,子节点保持了对父节点的引用。确切的说,JS代码中对单位格的引用造成了全部表格被留在内存中了,所以在移除有被引用的节点时刻要当心。

编译器和操作体系合营工作赞助开辟者完成大年夜部分的内存治理,然则我们推荐你懂得一下底层到底产生了什么。

编译代码的时刻,编译器会解析原始数据类型,提前计算出它们须要多大年夜的内存空间。然后将所需的数量分派在栈空间中。之所以称为栈空间,是因在函数被调用的时刻,他们的内存被添加在现有内存之上(就是会在栈的最膳绫擎添加一个栈帧来指向存储函数内部变量的空间)。终止的时刻,以LIFO(落后先出)的次序移除这些调用。例如:

  1. int n; // 4字节 
  2. int x[4]; // 4个元素的数组,每个元素4字节 
  3. double m; // 8字节 

编译器立时知道须要内存 4 + 4 × 4 + 8 = 28字节。

这是当前整型和双精度的大年夜小。大年夜约20年以前,整型平日只须要2个字节,双精度须要4个字节,你的代码不受基本数据类型大年夜小的限制。

编译器会插入与操作体系交互的代码,来请求栈中须要大年夜小的字节来储存变量。

在膳绫擎的例子中,编辑器知道每个变量精确的地址。事实上,无论什么时刻我们写变量n,将会在内部被翻译成类似“memory address 4127963”的语句。

留意,如不雅我们测验测验拜访x[4]的内存(开端声明的x[4]是长度为4的数组,x[4]表示第五个元素),我们会拜访m的数据。那是因为我们正在拜访一个数组里不存在的元素,m比数组中实际分派内存的最后一个元素x[3]要远4个字节,可能最后的结不雅是攫取(或者覆盖)了m的一些位。这肯定会对其他法度榜样产生不欲望产生的结不雅。

 1/7    1 2 3 4 5 6 下一页 尾页

  推荐阅读

  微软雅黑升级:Windows 10 RS4快速预览版17025更新内容大全

沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!改良微软雅黑字体:正如大年夜中国Windows Insider会员收集的反馈,微软雅黑是用中文(简体)说话来显示Windows UI文本的字>>>详细阅读


本文标题:如何处理JavaScript内存泄露

地址:http://www.17bianji.com/lsqh/38229.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)