码迷,mamicode.com
首页 > 编程语言 > 详细

Javascript高级程序设计——垃圾收集

时间:2015-08-31 14:53:29      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

  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后,当不再使用这个数据时手动解除引用,等待下次垃圾收集器运行时回收,而不是立即回收。

 

  小结:

  1. 基本类型在内存中占固定大小空间,因此会保存在栈内存中
  2. 从一个变量向另一个变量复制基本类型的值时,会创建这个值副本
  3. 引用类型的值是对象,保存在堆内存中,引用类型的值是指向对象的指针。
  4. 从一个变量向另一个变量复制引用类型的值,复制的是指针,因而两个变量都指向同一个对象

 

Javascript高级程序设计——垃圾收集

标签:

原文地址:http://www.cnblogs.com/yangxunwu1992/p/4772839.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!