zoukankan      html  css  js  c++  java
  • IE的内存泄露——内存回收机制

    前言

    C和C++语言是依赖开发人员来管理内存的,这样的做法大大提升程序出错的概率。在编写javascript代码的时候,就不用关心这个问题了,javascript对内存的回收管理是自动化的。原理很简单,周期性地找出不需要的内存进行释放。对于很多人来说,说起周期性的垃圾回收机制可能会联想到IE6在这方面的一个表现很差的性能问题,这里先不讨论。先了解下回收机制使用的垃圾收集方式有哪些:

    1.标记清除

    标记清除(mark-and-sweep)是javascript中最常用的垃圾收集方式,垃圾收集器在运行时会对所有内存中的变量进行标记,然后去到环境中的变量和被环境中的变量引用的变量的标记。而剩下的是环境中无法访问到的变量,对其进行销毁和回收它们所占的内存空间。

    2.引用计数

    引用计数(reference counting)这个在javascript中比较少见,最初在Netscape Navigator 3.0中就是采用这种方式(当声明了一个变量并将一个引用类型赋值给该变量时,这个值引用次数就为1,如果同一个值又被赋给另一个变量,引用次数就加1。相反,在对这个值引用的变量指向另一个值的时候,次数减1。最后,当引用次数为0时则视为无法在访问,被销毁和回收相应的内存空间),但很快就被“循环引用”这个问题难住了,函数中对象的交叉引用和自引用,在函数执行完之后,对于标记清除策略来说对象已经离开的作用域名,这样的引用不会产生什么问题。但是,从引用次数上来说由于对象继续存在导致次数不为0而长期存在与内存中,导致内存泄露问题。所以,原生的javascript不采用这种方式来回收内存。

    IE中的引用计数策略

    由于IE中的BOM和DOM这个类非原生的javascript,采用的是COM对象的形式实现的,而COM对象的垃圾回收机制就是引用计数策略。在IE中对DOM、BOM对象进行操作的时候,就可能触发循环引用(IE9把这两个也变成了原生javascript对象),这就能解释为什么会存在IE的内存泄露问题。

  • 相关阅读:
    农民没有钱,怎样从种植养殖方面创业?
    有几万闲钱,投资什么好?
    2019适合创业的项目有哪些呢
    1981年的五块钱相当于现在多少钱的购买力?
    现阶段有50万资金,想去开一个店,从事什么行业好?
    投资40万左右适合做什么?
    阿里联手百联打造新零售,耗巨资10亿成立便利店
    90后,是被逼创业的,大家觉得呢?
    小本创业,具体怎么办?
    (三)调用web服务
  • 原文地址:https://www.cnblogs.com/zgl2007dj/p/3328360.html
Copyright © 2011-2022 走看看