GC与JS内存泄露(2)

作者:alucard 来源:Alibaba.com UED 时间:2010-09-25 19:01:00 

标记-清除(Mark-Sweep)算法:同样是房间和白纸的例子,这次规则有所修改。白纸仍然随便用,并且,一开始,不需要做什么记号,但是用到某个时候,机器人会突然命令所有人停下来,这时,需要每个人在自己仍然需要使用的白纸上做一个记号,大家都做完记号后,机器人会把那些没有记号的白纸全部扔进垃圾箱。正如其名称所暗示的那样,标记-清除算法的执行过程分为“标记”和“清除”两大阶段。这种分步执行的思路奠定了现代垃圾收集算法的思想基础。与引用计数算法不同的是,标记-清除算法不需要运行环境监测每一次内存分配和指针操作,而只要在“标记”阶段中跟踪每一个指针变量的指向——用类似思路实现的垃圾收集器也常被后人统称为跟踪收集器( Tracing Collector )。当然,标记-清楚算法的缺陷也很明显,首先是效率问题,为了标记,必须暂停程序,长时间进行等待,其次,标记清除算法会造成内存碎片,比如被标记清除的只是一些很小的内存块,而我们接下来要申请的都是一些大块的内存,那么刚才清除掉的内存,其实还是无法使用。解决方案,常见的有2种,一是清楚后对内存进行复制整理,就像磁盘整理程序那样,把所有还在使用的内存移到一起,把释放掉的内存移到一起,如图:

但是,这样一来效率就更低了。

第二种方案是不移动内存,而是按大小分类,建立一系链表,把这些碎片按大小连接并管理起来,(4个字节的内存一个链表,8个字节的内存一个链表……)如果我们需要4个字节的内存,就从4个字节的链表里面去取,需要16个字节,就从16字节的链表里面去取,只有到了一定时候,比如程序空闲或者大块的内存空间不足,才会去整理合并这些碎片。

为什么重点谈mark-sweep算法呢,主要是ie对javascript的垃圾回收,采用的就是这种算法。

复制(copying)算法:mark-sweep算法效率低下,由此,又产生了一种新的奇思妙想,我们再把规则换一下:还是房间和白纸的例子,这次我们把房间分成左右2部分,一开始,所有人都在左边,白纸仍然随便用,一定时候,机器人又会叫大家停下来,这次不做记号了,你只要带着你还需要的白纸转移到右边去就可以了(相当于把现有的程序复制一份,无法使用的部分自然不会被复制),那些没用的纸自然就剩了下来,然后机器人会把左边所有的垃圾打扫干净(相当于把原先使用的那一半内存直接清空),下次执行垃圾回收的时候采用同样的方式,只不过这次从右边向左边迁移。这种算法的效率奇高,可惜,对内存的消耗太大,尤其是在1960年,内存可比黄金贵多了,直接砍掉一半的内存,显然是无法接受的。

了解万垃圾回收算法,再来看看IE下为什么会产生内存泄露。

标签:内存,js,javascript,IE
0
投稿

猜你喜欢

  • 使用go net实现简单的redis通信协议

    2024-05-29 22:06:25
  • Python名片管理系统+猜拳小游戏案例实现彩(色控制台版)

    2021-10-26 03:52:44
  • 取numpy数组的某几行某几列方法

    2022-03-10 02:04:56
  • Python decimal模块使用方法详解

    2022-09-06 12:04:33
  • SQL Server 2012 安装与启动图文教程

    2024-01-27 08:33:35
  • Oracle系统表外键的更名

    2010-07-26 13:07:00
  • 解析Tensorflow之MNIST的使用

    2021-09-06 03:34:27
  • python调试神器PySnooper的使用

    2021-08-28 23:25:49
  • Python创建对称矩阵的方法示例【基于numpy模块】

    2021-01-03 07:35:59
  • 使用python判断你是青少年还是老年人

    2021-03-18 14:42:23
  • Python编程中字符串和列表的基本知识讲解

    2022-02-19 16:39:25
  • ASP与数据库应用(给初学者)

    2009-03-09 18:32:00
  • python3 线性回归验证方法

    2022-12-03 10:49:09
  • Python 堆叠柱状图绘制方法

    2022-05-15 01:39:00
  • pytorch通过训练结果的复现设置随机种子

    2021-04-19 07:58:53
  • Python调用飞书发送消息的示例

    2022-10-20 14:21:23
  • mysql 查询数据库中的存储过程与函数的语句

    2024-01-26 17:30:35
  • asp.net中文件下载功能的实例代码

    2023-07-20 15:46:51
  • 深入浅析mybatis oracle BLOB类型字段保存与读取

    2024-01-15 02:21:26
  • 如何在Unix系统环境下安装MySQL数据库

    2009-01-04 13:09:00
  • asp之家 网络编程 m.aspxhome.com