• 垃圾回收 及 内存泄漏


    一、js 自动垃圾回收机制:

      1、垃圾回收的策略通常有两中——标记清除 和 引用计数 。      (详细介绍请参考J《avaScript高级程序设计》)

      2、js中最常用的垃圾收集方式是标记清除。但是COM对象(BOM和DOM对象就是使用C++以COM对象的形式实现的)垃圾收集机制采用的就是引用计数策略。
      使用标记清除的方式,不会引起内存泄漏的问题(哪怕对象相互引用也没有关系)。因为变量离开执行环境就会被回收。

      (个人认为)现在的浏览器基本不用引用计数,只有早期的ie中com对象是使用引用计数的,现在应该都是使用标记清除,所以不要考虑内存泄漏的问题。

      3、使用引用计数策略, 在函数中出现循环引用的时候,当函数执行完毕,可是函数里的变量引用计数不为零,垃圾回收机制无法回收,这个对象将一直存在内存中。如果这个函数被多次调用的话,就会导致大量内存得不到回收。从而出现内存泄漏问题。

      4、解决循环引用的问题,在不使用变量的时候,手工断开原生JavaScript对象(获取DOM对象的变量)与DOM元素之间的链接。用element = null;

      5、JavaScript内存泄漏的质疑  : http://www.cnblogs.com/iyangyuan/p/4310601.html (个人也觉得现在浏览器基本不会存在内存泄漏问题,基本不用考虑内存泄漏的问题)

    总结(个人观点):原生js对象不存在内存泄漏问题(原生js对象常用标记清除的垃圾回收策略),引起内存泄漏的问题主要还是在函数中对DOM的操作,同时DOM对象的属性指向函数的对象。内存泄漏和闭包没一点关系,只是闭包的结构操作函数有优势,不注意就会在闭包中出现对DOM的循环引用。

     参考: https://www.cnblogs.com/yhf286/p/4918095.html  或 https://www.cnblogs.com/sunhuahuaa/p/7655587.html (推荐)

    具体  闭包函数的问题  有空看  JavaScript高级程序设计

    二、js中给对象设置  null值  与  垃圾回收  的关系:https://www.cnblogs.com/cwWeb/archive/2012/07/14/2591956.html  或  https://zhidao.baidu.com/question/1175437169245726939.html

      1、垃圾清理是针对对象的,不是针对某个标示符的。对于值类型,函数执行后,如果其所在作用域并未被应用,会立即释放;要销毁一个对象,必须 要消除一个对象 的所有外部 引用

         所以 将变量 设置 为 null,对象 不一定会被 垃圾回收。对象 只要 没有 外部 引用,自动回 被回收的。

      2、(个人)非JS 创建的 对象,js 的标识符 可以引用,但是无法 通过设置 引用的 标识符 为 null ,将这样的对象 垃圾回收。因为 整个 web 环境还是有 引用他们的

        这样的对象有:DOM 树上DOM对象【js创建的DOM对象没有挂DOM树,就可以被垃圾回收】,BOM对象等。

        这种 web 环境 带有 的对象,要清除,还要看自身 是否有 这样的 API 去处理。

        

    三、绑定事件 的对象,如果 对象被 回收了。那他所绑定的事件还 在吗,会被 回收吗。

      1、首先 确认 对象是否真的被回收了,如果只是 指向的 标识符 设置 为了 null ,这个对象不一定 被回收了。  https://www.imooc.com/wenda/detail/490415

    var wraper = document.querySelector('#wraper');  //  获取 DOM 树上的DOM对象
    wraper.onclick = handle;
    wraper = null;  //  这里只是 把 wraper 标准 对 DOM 的引用断开了,但是 web 环境 对 这个DOM对象的 引用还是 存在的,所以这个DOM 对象并没有被回收。DOM对象的事件还是存在的。

      2、确认 DOM 对象已经被 清除 回收了,那他所绑定的 事件函数 也会 被 垃圾回收掉。因为没有指向这个 事件函数的 东西了。

         不过 这点 可能 和  浏览器的 垃圾 回收 机制不同,好像低版本 的 IE 浏览器,需要手动设置 具名函数,函数名 为 null。

      3、js中事件是 具名函数 和 匿名函数是有区别的:https://developer.aliyun.com/ask/66988?spm=a2c6h.13159736 

     
  • 相关阅读:
    高级特性(7)- 高级AWT
    洛谷 P1948 [USACO08JAN]电话线Telephone Lines
    洛谷 P2015 二叉苹果树
    洛谷 P2014 选课
    洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails(不明原因的scanf错误)
    cogs 10. 信号无错传输
    cogs 9. 中心台站建设。。。
    洛谷 P1731 生日蛋糕
    洛谷 P1092 虫食算
    洛谷 P1034 矩形覆盖
  • 原文地址:https://www.cnblogs.com/wfblog/p/9064884.html
Copyright © 2020-2023  润新知