标签:
javascipt具有自动垃圾回收机制
局部变量只在函数执行过程中存在,在这个过程中,会为局部变量在栈上(或堆)内存分配相应空间,来储存他们的值,当函数执行完,局部变量就没有存在的必要了,所以这个时候可以释放他们的内存。而垃圾收集器必须跟踪那个变量有用,那个变量没用,对不用的变量打上标记,以便回收。
标记清除:
当变量进入环境时,就将这个变量标记为”进入环境“,当离开环境时标记为”离开环境”等待内存回收。
引用计数:
引用计数就是跟踪记录每个值被引用的次数,当声明一个变量,并将一个应用类型值赋值给该变量, 则这个值的引用次数就是1,如果同一个值又被引用给另外一个变量,则这个值的引用次数加一,如果包含这个值引用的变量又取另外的值,这个值的引用减一。
当引用次数为0时,说明没办法访问这个值,因而就可以将其占用的内存空间回收。
引用计数的问题:循环引用
function cricle(){ var objA = new Object(); var objB = new Object(); objA.someObj = objB; objB.someObj = objA; } //这个例子中objA和objB通过属性相互引用,引用次数都是2,函数执行完后他们的引用次数永远都不会是0,将无法回收。IE中的一部分对象是com,采用的引用计数的回收机制。 为了避免循环引用问题,可以手动消除循环引用 函数执行完后: objA.someObj = null; objB.someObj = null; 切断了与之前引用值之间连接,下次垃圾收集器就会删除这些值回收内存。
管理内存:
通常浏览器的可用内存是比分配给桌面应用程序少的,为提升性能一般只为执行代码保存必要的数据,一旦数据不再用,最后通过将其置为null,来释放器引用,即解除引用。
function createPerson(name){ var localPerson = new Object(); localPerson.name = name; return localPerson; } var globalPerson = createPerson("yangxunwu"); 执行代码段。。。 手动解除引用。 globalPerson = null;createPerson()创建了全局变量globalPerson后,当不再使用这个数据时手动解除引用,等待下次垃圾收集器运行时回收,而不是立即回收。
小结:
- 基本类型在内存中占固定大小空间,因此会保存在栈内存中;
- 从一个变量向另一个变量复制基本类型的值时,会创建这个值副本。
- 引用类型的值是对象,保存在堆内存中,引用类型的值是指向对象的指针。
- 从一个变量向另一个变量复制引用类型的值,复制的是指针,因而两个变量都指向同一个对象
标签:
原文地址:http://www.cnblogs.com/yangxunwu1992/p/4772839.html