比如,读、写变量的值或者对象的属性,抑或向一个函数传递参数。
内存不在被须要时释放内存
大年夜部分的内存治理问题都在这个阶段出现。
这里最难的义务是找出这些被分派的内存什么时刻不再被须要。这经常请求开辟者去决定法度榜样中的一段内存不在被须要并且释放它。
高等说话嵌入了一个叫垃圾收受接收的软件,它的工作是跟踪内存的分派和应用,以便于发明一些内存在一些情况下不再被须要,它将会主动地释放这些内存。
不幸的是,这个过程是一个近似的过程,因为一般关于知道内存是否是被须要的问题是弗成断定的(不克不及用一个算法解决)。
大年夜部分的垃圾收受接收器会收集不再被拜访的内存,例如指向它的所有变量都在感化域之外。然而,这是一组可以收集的内存空间的近似值。因为在任何时刻,一个内存地址可能还有一个在感化域里的变量指向它,然则它将不会被再次拜访。
垃收受接收集
因为找到一些内存是否是“不再被须要的”这个事实是弗成剖断的,垃圾收受接收的实现存在局限性。本节解释须要的概念去懂得重要的垃圾收受接收算法和它们的局限性。
内存引用
垃圾收受接收算法依附的重要概念是引用。
在内存治理的语境下,一个对象只要显式或隐式拜访另一个对象,就可以说它引用了另一个对象。例如,JavaScript对象引用其Prototype(隐式引用),或者引用prototype对象的属性值(显式引用)。
在这种情况下,“对象”的概念扩大到比通俗JavaScript对象更广典范围,并且还包含函数感化域。(或者global词法感化域)
词法感化域定义变量的名字在嵌套的函数中若何被解析:内部的函数包含了父级函数的感化域,即使父级函数已经返回。
引用计数垃圾收受接收
看一下下面的代码:
- var o1 = {
- o2: {
- x: 1
- }
- };
- //2个对象被创建
- /'o2'被'o1'作为属性引用
- //谁也不克不及被收受接收
- var o3 = o1; //'o3'是第二个引用'o1'指向对象的变量
- o1 = 1; //如今,'o1'只有一个引用了,就是'o3'
- var o4 = o3.o2; // 引用'o3'对象的'o2'属性
- //'o2'对象这时有2个引用: 一个是作为对象的属性
- //另一个是'o4'
- o3 = '374'; //'o1'本来的对象如今有0个对它的引用
- //'o1'可以被垃圾收受接收了。
- //然而它的'o2'属性依然被'o4'变量引用,所以'o2'不克不及被释放。
- o4 = null; //最初'o1'中的'o2'属性没有被其他的引用了
- //'o2'可以被垃圾收受接收了
轮回引用创造麻烦
在涉及轮回引用的时刻有一个限制。鄙人面的例子中,两个对象被创建了,并且互相引用,如许创建了一个轮回引用。它们会在函数调用后超出感化域,应当可以释放。然而引用计数算法推敲到2个对象中的每一个至少被引用了一次,是以都弗成以被收受接收。
- function f() {
- var o1 = {};
- var o2 = {};
推荐阅读
微软雅黑升级:Windows 10 RS4快速预览版17025更新内容大全
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!改良微软雅黑字体:正如大年夜中国Windows Insider会员收集的反馈,微软雅黑是用中文(简体)说话来显示Windows UI文本的字>>>详细阅读
本文标题:如何处理JavaScript内存泄露
地址:http://www.17bianji.com/lsqh/38229.html
1/2 1