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的内存泄露问题。

  • 相关阅读:
    NSCoder
    OC_NSString、
    OC_内存管理(二)对象复制、循环引用问题、自动释放池
    OC_id类型
    OC_内存管理
    当 IDENTITY_INSERT 设置为 OFF 时,不能向表 '#TT' 中的标识列插入显式值。 sql server 临时表
    c# 访问SQL Server 其他会话正在使用事务的上下文
    EF 中事务的书写
    iis 不能访问json文件
    在开源中国(oschina)git中新建标签(tags)
  • 原文地址:https://www.cnblogs.com/zgl2007dj/p/3328360.html
Copyright © 2011-2022 走看看