小张和js垃圾回收原理

轮到垃圾回收原理了

    • JS中的垃圾回收机制
    • 标记清除法(最常见)
    • 引用计数法
    • 引起内存泄漏的情况

JS中的垃圾回收机制

JavaScript具有自动垃圾回收机制(Garbage Collecation)
原理:垃圾收集器会定期(周期性)找出内些不再继续使用的变量,然后释放其内存

标记清除法(最常见)

原理:

  • 在函数声明一个变量时,就将这个变量标记为进入环境
  • 从逻辑上说,永远都不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就有可能用到他们。而当变量离开环境时,则将其标记为离开环境

工作流程:

  1. 垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记(进入环境
  2. 去掉环境中的变量以及被环境中的变量应用的变量的标记(闭包)
  3. 再被加上标记的会被视为准备删除的变量(离开环境
  4. 垃圾回收器完成内存清除工作,销毁内些带标记的值并回收他们所占用的内存空间

引用计数法

原理:

  • 跟踪记录每个值被引用的次数

工作流程:

  • 声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值的引用次数是1
  • 同一个值又被赋给另一个变量,这个引用类型值的引用次数+1
  • 当包含这个引用类型值的变量又被赋值成另一个值了,那么这个引用类型值的引用次数-1
  • 当引用次数变成0,就没办法访问这个值
  • 当垃圾收集器下一次运行时,他就会释放引用次数时0的值所占的内存

问题:

  • 循环引用的时候就会释放不掉内存
  • 解决方法——手工断开js对象和DOM之间的连接,赋值为null

引起内存泄漏的情况

虽然有垃圾回收机制,还是容易造成内存泄漏

  1. 意外的全局变量引起内存泄漏:全局变量不会被回收——解决:使用严格模式避免
  2. 闭包引起的内存泄漏:闭包维护函数内局部变量,使其得不到释放——解决:将事件处理函数定义在外部,解除闭包,或者在定义事件处理函数的外部函数中,删除对dom的引用
  3. 没有清理的dom元素引用:虽然别的地方删除了,但是对象中还是存在对dom的引用——解决:手动删除
  4. 被遗忘的定时器或者回调:定时器中有dom的引用,即使dom删除了,但是定时器还在,所以内存中还是有这个dom——解决:手动删除定时器和dom
  5. 子元素存在引起的内存泄漏:div中的ul li 得到这个div,会间接引用某个得到的li,那么此时因为div间接引用li,即使li被清空,也还是在内存中,并且只要li不被删除,他的父元素都不会被删除——解决:手动删除

你可能感兴趣的:(小张和js垃圾回收原理)