关于JS垃圾回收机制

一、垃圾回收机制的必要性

由于字符串、对象和数组没有固定大小,所以当它们的大小已知时,才能对它们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便它们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。

  JavaScript的解释器可以检测到何时程序不再使用一个对象了,当它确定了一个对象是无用的时候,它就知道不再需要这个对象,可以把它所占用的内存释放掉了。

二、垃圾回收机制

  Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。

1、标记清除(常用) 

  当一块内存中的数据能够被访问时,垃圾回收器就认为"该数据能够被获得"。不能够被获得的数据,就会被打上标记,并回收内存空间。这种方式叫作标记---清除算法。

这个算法会设置一个全局对象,并定期地从全局对象开始查找,垃圾回收器会找到所有可以获得与不能获得的数据。

  工作流程:

   (1)垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记。

   (2)去掉环境中的变量以及被环境中的变量引用的变量的标记。

   (3)再被加上标记的会被视为准备删除的变量。

   (4)垃圾回收器完成内存清除工作,销毁那些带标记的数据并回收它们所占用的内存空间。

  注意:在局部作用域中,当函数执行完毕后,局部变量也就没有存在的必要了,因此垃圾收集器很容易做出判断并回收。但在全局中,变量什么时候需要自动释放内存空间则很难判断,因此我们在开发时,应尽量避免使用全局变量。如果使用了全局变量,则建议不再使用它时,通过释放变量方式,以确保能够及时回收内存空间。

2、引用计数

  跟踪记录每个值被引用的次数。例当变量声明,第一次赋值时记为1,然后当这个变量值改变时,记录为0,将计数为0的回收。

  工作流程:

   (1)声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值的引用次数就是1。

   (2)同一个值又被赋值给另一个变量,这个引用类型值的引用次数加1.

   (3)当包含这个引用类型值的变量又被赋值成另一个值了,那么这个引用类型值的引用次数减1.

   (4)当引用次数变成0时,说明没办法访问这个值了。

   (5)当垃圾收集器下一次运行时,它就会释放引用次数是0的值所占的内存。  

但是当循环引用的时候就会释放不掉内存。

1 function problem() {2     var objA = new Object();3     var objB = new Object();4 5     objA.someOtherObject = objB;6     objB.anotherObject = objA;7 }

当objA和objB通过各自的属性相互引用,也就是说这两个对象的引用次数都是2。在采用引用计数的策略中,由于函数执行之后,这两个对象都离开了作用域,函数执行完成之后,objA和objB还将会继续存在,因为他们的引用次数永远不会是0。这样的相互引用如果说很大量的存在就会导致大量的内存泄露。

因为IE中的BOM、DOM的实现使用了COM,而COM对象使用的垃圾收集机制是引用计数策略。所以会存在循环引用的问题。

解决:手工断开js对象和DOM之间的链接,赋值为null。IE9把DOM和BOM转换成真正的JS对象了,所以避免了这个问题。

(0)

相关推荐

  • Python 那些永远用不到的对象,我们称之为「垃圾」

    我们知道使用 Python 可以创建对象,当我们去引用它的时候,系统会开辟一个内存空间存放对象,不过可能有些对象我们用完之后,永远再也不会去使用了,那这对象不能一直留在内存里边吧,对象已经废了,也就成 ...

  • Java开发之虚拟机八股文分享

    简述JVM内存模型 线程私有的运行时数据区: 程序计数器.Java 虚拟机栈.本地方法栈. 线程共享的运行时数据区:Java 堆.方法区. 简述程序计数器 程序计数器表示当前线程所执行的字节码的行号指 ...

  • C# 中==与Equals方法比较

    static void Main(string[] args) { string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); str ...

  • PHP的引用计数是什么意思?

    PHP的引用计数是什么意思? 什么是引用计数 在PHP的数据结构中,引用计数就是指每一个变量,除了保存了它们的类型和值之外,还额外保存了两个内容,一个是当前这个变量是否被引用,另一个是引用的次数.为什 ...

  • 浅谈浏览器垃圾回收机制

    javaScriipt 使用垃圾回收机制来自动管理内存 js 的回收机制目前分为两种方式:1.标记清除(各大浏览器主流算法)2.引用技术 一: 标记清除 这种算法的思想是给当前不使用的值加上标记,然后 ...

  • 第 111 天:Python 垃圾回收机制

    众所周知,Python 是一门面向对象语言,在 Python 的世界一切皆对象.所以一切变量的本质都是对象的一个指针而已. Python 运行过程中会不停的创建各种变量,而这些变量是需要存储在内存中的 ...

  • 面试题-python 垃圾回收机制?

    前言 简历上写着熟悉 python 面试官上来就问:说下python 垃圾回收机制?一盆冷水泼过来,瞬间感觉 python 不香了. Python中,主要通过引用计数(Reference Counti ...

  • PHP垃圾回收机制的一些浅薄理解

    PHP垃圾回收机制的一些浅薄理解 相信只要入门学习过一点开发的同学都知道,不管任何编程语言,一个变量都会保存在内存中.其实,我们这些开发者就是在来回不停地操纵内存,相应地,我们如果一直增加新的变量,内 ...

  • [PHP小课堂]PHP垃圾回收机制的一些浅薄理解

    [PHP小课堂]PHP垃圾回收机制的一些浅薄理解 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[xiaoyuezigonggong/149844827]免费得PHP.项目管理学习资料 ...

  • 火山中文编程:012如何删除变量及垃圾回收机制介绍

    第一种方法,鼠标选中需要删除的变量,当鼠标选中后,选中的变量会高亮显示,这时候直接按键盘DELETE键即可快速删除变量,这种方法只有选中变量表格后才能使用,否则无效. 第二种方法删除变量的方法,鼠标放 ...

  • 说说Python中的垃圾回收机制?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • 垃圾回收算法有几种类型? 他们对应的优缺点又是什么?

    常见的垃圾回收算法有: 标记-清除算法.复制算法.标记-整理算法.分代收集算法 标记-清除算法 标记-清除算法包括两个阶段:"标记"和"清除". 标记阶段:确定 ...

  • Go 语言如何实现垃圾回收中的 Stop the World (STW)

    Illustration created for "A Journey With Go", made from the original Go Gopher, created by ...