zoukankan      html  css  js  c++  java
  • 为什么循环引用会导致“内存泄漏”

    首先这个问题对于现代浏览器(IE9+)来说已经不是问题了,这个问题其实是出现在IE8的时代了

    我们主要是通过这个问题来介绍下浏览器的垃圾回收机制:

    js是有自己的一套自动垃圾回收机制的,这是大部分高级语言都具备的(除了c语言),然而它的机制是什么呢?

    采用过的有2种  标记清除 和  引用计数

    先明确一点现代浏览器采用的是标记清除

    举个栗子:

    function test(){
     var a = 10 ; //被标记 ,进入环境 
     var b = 20 ; //被标记 ,进入环境
    }
    test(); //执行完毕 之后 a、b又被标离开环境,被回收。

    是否回收的准则是是否离开环境

    而老浏览器采用的是引用计数

    举个栗子:

    function test(){
     var a = {} ; //a的引用次数为0 
     var b = a ; //a的引用次数加1,为1 
     var c =a; //a的引用次数再加1,为2
     var b ={}; //a的引用次数减1,为1
    }
    //test执行完后,全部变量会自动定义为undefined
    //c = undefined后a的引用次数也变为0了

    然而这种机制有个很严重的bug——循环引用

    function fn() {
     var a = {};
     var b = {};
     a.pro = b; //a引用次数为1
     b.pro = a;//b引用次数为1
    }
    //fn调用结束后,a=undefined,b=undefined
    //这样并没有使得a和b的引用次数减少
    //因为引用a和b的并不是b和a的本身,而是他们的属性
    //所以面对这种循环引用的状况,自动回收是没办法把引用次数降到0的
    //这个时候要我们手动在结尾那添加a.pro = undefined;b.pro = undefined
  • 相关阅读:
    WinForm笔记1:TextBox编辑时和DataGridView 单元格编辑时 的事件及其顺序
    Emgu 学习(4) 使用指针访问图像内存
    SolidWorks学习笔记1
    Emgu 学习(3) 绘图,使用鼠标绘图,使用trackbar
    NModbus4的使用
    C# async await的使用
    Emgu 学习(2) 视频文件播放
    redis-key2
    redis--key1
    rpc优化
  • 原文地址:https://www.cnblogs.com/amiezhang/p/8571906.html
Copyright © 2011-2022 走看看