javascript的内存管理详细解决方案
介绍低层次的语言,如C,低级别的内存管理命令,如malloc()和(),这需要开发人员手动释放内存。然而,高级语言如Javascript是不同的。当创建对象(对象、字符串等)时,内存被分配。当它们不被使用时,内存会自动恢复,自动回收的过程称为垃圾回收,由于垃圾收集的存在,Javascript和其他高级语言开发人员对内存管理产生了错误的理解。
记忆的生命周期
无论什么编程语言,内存的生命周期基本相同。
1。分配你需要的内存
2。利用他读书写字
三.在不需要内存时释放资源
步骤1和步骤2清楚地意识到所有语言。对于步骤3,低级语言需要开发人员执行显式执行。对于像Javascript这样的高级语言,操作的这一部分是对解析器完成的,所以您不会意识到它。
Javascript中的分配操作
初始化值
当将变量赋给变量时,Javascript完成内存的分配。
复制代码代码如下所示:
var = 123;数字内存分配
var s =AZERTY; / /字符串的内存分配
var { { { {
甲:1,
B:空
对象对象分配};内存包含属性值。
var a = { 1,null,阿布拉}; / /数组的值包含在分配的内存
函数f(a){
返回一个+ 2;
作为一个功能的内存(} / /分布函数可以调用)
函数表达式也是内存分配的对象。
SomeElement.addEventListener(听到咔哒声,函数(){(){
someelement.style.backgroundcolor = '蓝色';
},假);
通过函数调用完成分配
在执行某些函数之后,还有一个对象分配的例子。
复制代码代码如下所示:
新日期();
var = document.createelement('div '); / /分配一个DOM元素
有些方法分配新的值或对象。
复制代码代码如下所示:
var s =AZERTY;
VaR S2 = s.substr(0, 3); / / S2是一个新的字符串。
由于一个字符串与{ 0,Javascript,3 }内容相同,可以创建一个新字符串
var a = {ouais ouais
生成
VaR A3 = a.concat(A2); / /放和A2一起产生一个新的阵列
使用价值
值的使用实际上是分配内存的读写操作,这些操作包括对变量或对象的属性进行读写,或者将参数传递给函数。
当不再需要时,释放内存
绝大多数内存管理问题都发生在这个阶段,最难做的事情是如何决定不再需要分配的内存,这常常需要开发人员在程序不再需要内存并释放资源时做出决定。
高级语言的解析器内嵌了一个叫做垃圾收集器的程序。它的工作是跟踪内存的分配和使用,确定内存是否需要,在不再需要时执行资源释放操作。他只能得到一个近似值,因为这是一个不确定的问题来判断是否需要内存(而不是一个算法的解决方案)。
垃圾收集
如上所述,我们不能准确地确定不再需要自动内存。因此,垃圾收集仅限于解决问题。本节将解释理解主要垃圾收集算法及其局限性的必要概念。
参考
垃圾收集的一个主要概念是引用。在内存管理中,当一个对象显式或隐式地使用另一个对象时,我们说他引用另一个对象。
在这种情况下,对象的概念超出了传统意义上的Javascript的概念,并且还包括函数作用域和全局范围。
使用引用计数算法收集垃圾
下面是一个理想化的算法,它引入了对象不再需要而对象不引用其他对象的概念,当对象的引用指针变成0时,它被认为可以被回收。
实例uff1a
复制代码代码如下所示:
var { { { {
{:
B:2
}
}创建两个对象。对象(a)是另一个对象(对象引用)引用,并将a作为其属性。
对象是 o o O引用变量。
显然,没有任何对象可以被恢复。
var O;o;O2再次引用对象变量。
o = 1; / o不再引用对象,只有O2仍然引用对象。
一个对象属性引用
对象是,另外两个对象引用是O2属性A和OA变量。
这个对象不再被其他对象引用,但是他的属性仍然是OA变量引用,所以他还没有被释放。
现在已不再是对象引用的其他属性,对象可以被恢复。
限制:周期
该算法有其局限性。当一个对象引用另一个对象时,当它形成循环引用时,它们就不再需要了,而垃圾收集器也不会回收它们。
复制代码代码如下所示:
函数f(){
var;
var;
O = O2;O/O参考氧
O2 = O;O O / O2参考O
返回AZERTY;
}
(f);
创建两个对象,并形成相互引用。
在函数调用结束后,它们将不会与函数作用域分开,尽管它们没有被使用,但不会被释放。
这是因为引用计数算法只要对象存在,就不能被垃圾收集。
现实的一个例子
在IE6和7,使用参考对DOM对象计数算法,会有内存泄漏的问题。
复制代码代码如下所示:
var div = document.createelement(div);
div.onclick =函数(){
DoSomething();
单击属性引用事件处理程序。
当事件处理程序/访问时间为div变量时,将形成循环引用,将导致两个对象将无法恢复,造成内存泄漏。
标记清除算法
他介绍的概念,对象不再需要被访问的对象(对象性)。该算法假定存在一系列的根对象(在Javascript中的根对象是全局对象)。每隔一段时间,垃圾收集器从根对象开始,遍历所引用的对象,然后遍历对象引用的对象,等等。这样,垃圾收集器就可以获得所有可访问的对象,并检索不可访问的对象。
与以往算法相比,该算法将0个对象引用设置为不可到达对象,避免了循环引用带来的麻烦。
2012年底,大多数现代浏览器使用这个标签,一个垃圾收集器清除algorithms.javascript垃圾收集区(代 / / /并行增量并发垃圾收集)提高了在过去几年中的相关算法,但垃圾收集算法本身(标记清除算法)以及如何决定一个对象不再需要的不是改进。
循环不再是问题。
在第一种情况下,函数调用结束后,两个对象不会被全局对象的引用,也不能通过对象的引用引用全局对象。因此,他们将被标记为非由Javascript垃圾收集器可访问的对象。这种事情也发生在二例,当div和事件处理函数被标记为被垃圾收集器不容易,他们被释放。
限制:对象需要明确标注为不可访问
这种标记的方法是有限的,但是我们在编程方面与他没有联系,所以我们很少关心垃圾收集相关的内容。