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
  • 相关阅读:
    多区域显示(5)-粘贴为图片链接
    coco2d-x怎样创建project
    把数组排成最小的数
    前端框架 EasyUI (1)熟悉一下EasyUI
    easyui form 方式提交数据
    Jquery插件easyUi表单验证提交
    EASYUI 表单(FORM)用法
    easyui form submit 不提交
    JQuery Easy Ui dataGrid 数据表格
    EasyUI datagrid 格式化显示数据
  • 原文地址:https://www.cnblogs.com/amiezhang/p/8571906.html
Copyright © 2011-2022 走看看