js垃圾回收及内存泄漏

js垃圾回收

  • js可以自动回收申请却未使用的内存,因为每次清除须要的性能较大,不是时时在刷新,而是每隔一段时间才进行一次。
  • 回收的两种方式
    • 标记清除(经常使用) 在内存中先标记变量,而后清除那些那些进入环境或者引用的变量的标记,当进入环境退出环境,将被从新标记并被清除,释放出内存。
    • 引用计数 计算变量被引用的次数,引用次数为0将被清除释放内存。 缺点:
      • 没法清除那些引用次数不为0,但又不须要的内存
       let arr = [1,2,3]; console.log('ok'); //数组[1,2,3]引用次数为1,可是又没用到就会一直占着内存 //解决方式:arr.length=0 let arr = [1,2,3]; console.log('ok'); //数组[1,2,3]引用次数为1,可是又没用到就会一直占着内存 //解决方式:arr.length=0
      • 没法解决循环引用的问题
       function fn(){ let obj1 = {}; let obj2 = {}; obj1.a = obj2; obj2.b = obj1; } //解决方法:手动释放 obj1 = null obj2 = null function fn(){ let obj1 = {}; let obj2 = {}; obj1.a = obj2; obj2.b = obj1; } //解决方法:手动释放 obj1 = null obj2 = null

内存泄漏

  • 某些状况没法释放内存,变量一直处于环境中
  • 出现内存泄漏的一些状况
    • 最多见的就是闭包了
      • 闭包会建立一个不会被销毁的栈内存。
      • 不经意的全局变量
       function fn(){ obj = {};//没用声明关键字,至关于建立了一个全局变量 } function fn(){ obj = {};//没用声明关键字,至关于建立了一个全局变量 }
      • 计时器没有被清除
       setInterval() setTimeout() //解决方法 清除对应定时器的idsetInterval() setTimeout() //解决方法 清除对应定时器的id
滑稽脸
相关文章
相关标签/搜索