• 为什么循环引用会导致“内存泄漏”


    首先这个问题对于现代浏览器(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
  • 相关阅读:
    rails s 命令不起作用
    ubuntu下virtualbox共享usb
    ubuntu15.04 无法识别exfat格式
    .net core 2.2 修改IdentityUser主键标识类型
    Mac os 安装node.js及环境变量的配置过程
    常见互联网网络名词整理
    assert的用法
    Mac系统中 改变 pip总是默认安装在Mac上自带的python上为python3
    测试工程师的发展之路
    MySQL的mysql-8.0.17-winx64版本安装过程中遇到的问题
  • 原文地址:https://www.cnblogs.com/amiezhang/p/8571906.html
Copyright © 2020-2023  润新知