XFE 技术 生活 文集

javascript内存管理

🔖 javascript 👀 9 🕒 2017-12-23

生命周期

无论什么编程语言,内存生命周期都是一致的————分配,使用,释放

内存管理

  • 某些类似C语言的程序,一般都有内存管理接口,开发人员需要显式分配和释放操作系统的内存
  • javascript会自动进行内存分配,并在不被使用时进行自动释放,这个过程被称为“垃圾回收”

垃圾回收

  • 有两种回收策略————引用计数和标记清除
  • 现代绝大多数游览器已经都采用后者
  • 垃圾回收算法依赖的主要概念是引用

引用计数

跟踪记录每个引用,存在引用的+1,不存在引用的-1,在代码操作过程中,最终引用为0的会被垃圾收集器在下次运行时清除

标记清除

检查对象是否可以获得————通过生成一个根列表,将引用保存在运行时的全局变量中(window),使得所有根和子对象都被标记为活跃的,而从根元素不可达的部分则被认为是垃圾,可以被回收

内存泄漏

  • 由于某些原因,使得一些内存没有归还给操作系统或者进入可用内存池,出现内存被占用的情形
  • 由于引用计数策略对于循环引用的对象不会进行回收,导致IE9以下采用引用计数策略的BOM和DOM对象出现互相引用时,会出现内存泄漏问题,只能手动处理和置空
  • 常见的内存泄漏————未带var声明的全局变量,被遗忘的定时器/回调,脱离dom的变量引用,闭包