`
firefly_zp
  • 浏览: 19274 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Javascript 垃圾收集机制

阅读更多

经常使用 Javascript 的人会琢磨其垃圾收集机制,Javascript 并不像 C,C++ 那样需要开发者手动去清除垃圾,在编写 Javascript 程序是,开发者无需关心内存使用问题,所需内存分配以及无用内存(垃圾)的回收完全实现了自动管理。究其根源,主要是程序收集那些不再使用的变量,并且释放其占用的内存。因此,垃圾收集机制会按照固定时间间隔,周期性反复的执行这一操作。


举例来说,局部变量只存在于函数内部,程序会为局部变量在栈内存或堆内存中分配对应的存储空间,当函数运行结束,局部变量所占用的内存就没有存在的必要了,这时程序会释放局部变量所占用的内存供其他变量使用。这是程序最简单释放内存的方法,但是很多时候,程序中变量会一直被使用,此时垃圾收集机制必须跟踪变量并且判断其是否被使用,是否可以释放其内存空间。

垃圾收集机制主要判断变量释放内存空间的方法有两个:其一是标记清除法,其二是引用计数法。

标记法,每个变量都有其运行环境,变量创建后会在某种环境中运行,比如创建一个局部变量,局部变量会运行在函数体内。当函数运行时,会标记局部变量为“进入环境”,当函数体运行结束后,意味着变量脱离了其运行环境,此时则将变量标记为“离开环境”。对于“离开环境”的变量,垃圾收集机制会进行相应记录,并且在下一个回收周期时将其释放。

引用计数法,跟踪记录每个值的被引用次数。声明一个变量并将一个引用类型值赋给该变量时,这个值得引用次数就是 1。如果同一个值又被赋给另外一个变量,则该值的引用次数加 1。相反,如果包含对这个值的引用的变量又取得另外一个值,这个值得引用次数减 1。当这个值得引用次数为 0 时,则说明没有办法再访问到此值,因此就可以将其占用的内存空间回收。当垃圾收集器在下一个周期运行时,会释放引用次数为零的值所占用的内存空间。(原文解释参考:Javascript 高级程序设计 - 第二版)

举个例子来说:
            function countMethod(){
                  var object1 = new Object(); // 声明变量,计数器由 0 变为 1
                  var object2 = new Object(); // 声明变量,计数器由 0 变为 1
                  object1.method1 = object2;  // object1 计数器 -1,object2 计数器 +1
                  object2.method2 = object1;  // object1 计数器 +1,object2 计数器 -1
            }
此函数运行退出后,object1 的计数器读数为 1,object2 的计数器度数为 1。所以两个变量都不会被销毁。如果大量的这样的程序存在于函数体内,就会导致大量的内存被浪费而无法回收,从而导致内存的泄露。

上述问题解决方法,手动释放 object1 object2 所占用的内存。即:
                 object1.method1 = null;
                 object2.method2 = null;

对比上面的例子,举一个正常情况下的例子。
            function countMethod(){
                  var object1 = new Object(); // 声明变量,计数器由 0 变为 1
                  var object2 = new Object(); // 声明变量,计数器由 0 变为 1
                  object1.method1 = "This is object1";  // object1 计数器 -1,object1 读数变为0
                  object2.method2 = "This is object2";  // object2 计数器 -1,object2 读数变为0
            }
通过上例看出,正常情况下,当函数运行结束后,object1 object2的读数均为 0,在下一个垃圾收集周期时,会被回收并且释放其所占用的内存。

分享到:
评论

相关推荐

    Javascript 垃圾收集机制介绍理解

    Javascript 垃圾收集机制介绍理解,需要的朋友可以参考一下

    javascript垃圾收集机制的原理分析

     javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存。在编写javascript程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理。下面将详细介绍...

    javascript垃圾收集机制与内存泄漏详细解析

    本文是对javascript中的垃圾收集机制与内存泄漏进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    跟我学习javascript的垃圾回收机制与内存管理

    JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。 不再使用的变量也就是生命周期结束...

    浅谈JavaScript的自动垃圾收集机制

    本文主要对JavaScript的自动垃圾收集机制进行简要分析,并介绍了垃圾收集的方式:标记清除(mark-and-sweep)和引用计数(reference counting),需要的朋友一起来看下吧

    谈谈JavaScript中的垃圾回收机制

    JavaScript 具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。  在编写 JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理。...

    全面了解JavaScirpt 的垃圾(garbage collection)回收机制

    JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。 不再使用的变量也就是生命周期结束...

    深入浅出理解JavaScript闭包的功能与用法

    函数也是对象,也有属性,通常执行一个函数时,局部变量在函数执行完后,内存会被回收,这是JS的垃圾收集机制决定的,如果想保存局部变量所占用的内存,就必须把保存在另一个不被回收的变量中,通常是全局变量。...

    JavaScript内存泄漏的处理方式

    下面就是小编整理的关于JS遇到内存泄漏问题...当创建对象和字符串等时,JavaScript就会分配内存,并在不再使用时自动释放内存,这种机制被称为垃圾收集。这种释放资源看似是“自动”的,但本质是混淆的,这也给JavaScri

    node-localcache:支持 TTL 的 Node.js 本地内存键值数据缓存系统

    LocalStash 有自己的垃圾收集机制来过期旧数据。 主要的设计考虑是小的性能开销和快速的垃圾收集机制。 应用程序接口 LocalStash 公开了以下 API: new LocalStash([cycleInterval], [options]) cycleInterval是...

    monitor-java-gc-on-aws-lambda

    在AWS Lambda上监视Java虚拟机垃圾收集这是关于的博客文章中引入的解决方案体系结构的实现。 当您想在上优化Java应用程序以提高性能和成本时,一般的步骤是:构建,评估然后优化! 为此,您需要一个可靠的监视机制。...

    wikitruth:该系统旨在通过一种审核机制来验证虚假新闻和宣传,以验证垃圾中的事实。 结束互联网上周期性讨论并扭曲错误信息传播的系统

    这是一项开放的研究,旨在收集所有可验证的事实,并允许每个人做出贡献,提出各种质疑和思考的质疑。 最终,我们可以提出一个真理和现实事实的“黄金源”,它在所有挑战中生存了下来,并得到了所有可用证据和论据的...

    TrashmanBegins

    垃圾人-开始 来自 MisoHungry 团队 你可以在这里试玩这个游戏: : PLEASE PLAY THIS ON CHROME. OTHERS ARE SLIGHTLY NOT COMPATIBLE WITH THIS GAME. ( IF YOU HAVE A TOUCHSCREEN LAPTOP, PLEASE USE ...

Global site tag (gtag.js) - Google Analytics