zoukankan      html  css  js  c++  java
  • 垃圾回收 及 内存泄漏

    一、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 

     
  • 相关阅读:
    16. 3Sum Closest
    17. Letter Combinations of a Phone Number
    20. Valid Parentheses
    77. Combinations
    80. Remove Duplicates from Sorted Array II
    82. Remove Duplicates from Sorted List II
    88. Merge Sorted Array
    257. Binary Tree Paths
    225. Implement Stack using Queues
    113. Path Sum II
  • 原文地址:https://www.cnblogs.com/wfblog/p/9064884.html
Copyright © 2011-2022 走看看