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

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

 

  小结:

  javascript变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型的值源自一下5种基本数据类型:Undefined、Null、Boolean、String、Number。引用类型如Object的各种实例。

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

  javascript具有自动垃圾收集机制的编程语言,开发人员不必关系内存的分配和回收问题。

  1. 离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。
  2. “标记清除”是目前主要的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,以后在回收。
  3. 另一种是“引用计数”,跟踪所以值被引用的次数,可能会导致循环引用的问题。
  4. 解除变量的引用有助于消除循环引用的问题,而且对垃圾收集也有好处,为确保有效的回收内存,应该及时消除不再使用的全局对象、全局对象属性和循环引用变量的引用

 

posted @ 2015-08-31 13:08  xnuwu  阅读(217)  评论(0编辑  收藏  举报