4.3 Javascript之垃圾回收

JavaScript的垃圾回收

JavaScript具有自动垃圾回收机制,垃圾回收器会周期性的检测程序中不再使用的变量,并自动回收释放其占用的内存

垃圾回收策略

  • 标记清除

标记清除的策略:当执行流进入某个作用域时,会将这个作用域里所有的变量打上将被使用的标记,意味着这些变量很可能会被使用,是不能被释放回收的,当执行流离开这个作用域时,便将不会被使用的变量打上相应标记,等待垃圾回收器周期到来并回收

  • 引用计数

声明一个变量,将一个引用类型的值赋值给该变量时,此引用类型的变量就被引用1次,如果再次将此引用类型的变量赋值给另一个变量,引用次数就会加1,随着执行流的推进,直到此引用类型变量的引用计数为0,便会被垃圾回收器在适当的时机回收

IE8及以下版本浏览器下BOM和DOM对象是用c++以COM对象的形式实现的,COM对象采用的是引用计数垃圾回收机制,如果变量之间存在循环引用,会导致变量无法被回收,最终将导致内存泄漏

function test(){
    var ele = document.getElementById("test");
    var obj = new Object();
    obj.child = ele;
    ele.attr = obj;
}

test();
//当test函数执行完毕后,obj和ele之间存在循环引用会导致这两个变量不会被回收,最终将导致内存泄漏
//IE9+浏览器已将DOM和BOM对象转为了javascript对象,也就不存在引用计数垃圾回收机制,消除了这种情况导致的内存泄漏问题

内存管理

一般来说,分配给浏览器的可用内存空间比桌面应用程序要少,主要的目的是防止浏览器耗尽系统资源导致系统崩溃。内存限制会影响变量的内存分配,还会影响调用栈以及线程中能够同时执行的语句数量

所以,在变量不再被使用的时候,最好手动将变量的值赋值为null,让其脱离执行环境,并告知垃圾回收器下个周期可以回收此变量

基本类型和引用类型

  • 基本类型为Undefined Null String Number Boolean
  • 基本类型都占用固定大小的内存,存储在栈中
  • 引用类型的值存储在堆中
  • 基本类型的多次赋值,拷贝的是值的副本,引用类型的多次赋值,存储的相同的指针,指向同一个堆地址
  • 检测一个基本类型可以使用typeof,检测所有的类型可用 Object.prototype.toString.call()

执行环境总结

  • 执行环境有全局环境和函数执行环境之分
  • 执行流进入一个新的执行环境时,都会创建一个用于搜索变量和函数的作用域链
  • 函数局部环境可以访问自己的局部环境,也可以访问父级的作用域,一直到全局环境里的变量和函数
  • 全局环境下的函数变量不能访问局部环境的变量和函数

猜你喜欢

转载自blog.csdn.net/qq452981462/article/details/80871599
4.3