`
firefly_zp
  • 浏览: 19946 次
  • 性别: 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。所以两个变量都不会被销毁。如果大量的这样的程序存在于函数体内,就会导致大量的内存被浪费而无法回收,从而导致内存的泄露。

对比上面的例子,举一个正常情况下的例子。
            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,在下一个垃圾收集周期时,会被回收并且释放其所占用的内存。

博文系作者原创,转载请注明地址:http://firefly-zp.iteye.com

分享到:
评论
2 楼 windrainpy 2013-08-11  
qqwswxdo 写道
有个问题想请教下:
object1.method1 = "This is object1";  // object1 计数器 -1,object1 读数变为0
object2.method2 = "This is object2";  // object2 计数器 -1,object2 读数变为0

上面说是如果包含对这个值的引用的变量又取得另外一个值,这个值得引用次数减 1,
这里的话,这个值代表Object的一个实例,对这个实例的引用的变量是object1,如果object1又取得另外一个值,那么实例的引用次数减一,这里的话,object1.method1 = XXXX,这里object1又取得了另外一个值了么?这不是只是对实例对象的属性的修改么?object1不是还是引用的是Object的实例么?
问题有点多哈,在此先谢过了。


同问~~我也有同样的疑问,不知博主举的这个实力是不是有问题啊?
1 楼 qqwswxdo 2012-11-02  
有个问题想请教下:
object1.method1 = "This is object1";  // object1 计数器 -1,object1 读数变为0
object2.method2 = "This is object2";  // object2 计数器 -1,object2 读数变为0

上面说是如果包含对这个值的引用的变量又取得另外一个值,这个值得引用次数减 1,
这里的话,这个值代表Object的一个实例,对这个实例的引用的变量是object1,如果object1又取得另外一个值,那么实例的引用次数减一,这里的话,object1.method1 = XXXX,这里object1又取得了另外一个值了么?这不是只是对实例对象的属性的修改么?object1不是还是引用的是Object的实例么?
问题有点多哈,在此先谢过了。

相关推荐

    【JavaScript源代码】一文带你了解JavaScript垃圾回收机制.docx

    ### JavaScript垃圾回收机制详解 #### 一、概述 在现代软件开发中,特别是前端领域,JavaScript 已成为不可或缺的一部分。随着应用复杂度的增加,如何有效地管理内存成为了开发者必须面对的问题之一。JavaScript ...

    JavaScript 垃圾回收机制分析

    每每都惊羡不已,最近精力主要用在了Web 开发上,读了一下《JavaScript高级程序设计》(书名很唬人,实际作者写的特别好,由浅入深)了解了一下JavaScript垃圾回收机制,对内存泄露有了一定的认识。 和C#、Java一样...

    JavaScript垃圾回收

    JavaScript垃圾回收机制是编程语言中一个至关重要的概念,特别是在JavaScript这种动态、自动管理内存的语言中。垃圾回收(Garbage Collection, 简称GC)的主要任务是自动检测并释放不再使用的内存,以防止内存泄漏,...

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

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

    谈谈JavaScript中的垃圾回收机制

    JavaScript中的垃圾回收机制是编程语言中管理内存的一种自动化方式,旨在自动识别并释放不再使用的内存空间,从而避免内存泄漏。JavaScript引擎负责执行此任务,使得开发者无需手动进行内存分配和回收,提高了编程...

    javascript运行机制1

    JavaScript 运行机制 JavaScript 运行机制是指 JavaScript 代码在浏览器或 Node.js 环境中执行的过程。这个机制涉及到变量作用域、函数执行、上下文创建和垃圾回收...* JavaScript 垃圾回收机制 * JavaScript 语法详解

    【JavaScript源代码】详解JavaScript的垃圾回收机制.docx

    ### JavaScript的垃圾回收机制详解 #### 一、为什么需要垃圾回收(GC) 在计算机程序运行过程中,随着时间的推移,程序会不断创建新的对象并占用内存。然而,并非所有创建的对象都会持续被使用,一旦某些对象不再...

    对于js垃圾回收机制的理解

    以下是对JavaScript垃圾回收机制的深入理解。 首先,JavaScript是一种高级编程语言,它允许开发者通过简单的变量声明来使用内存,而不必担心手动分配和释放内存的细节。JavaScript运行时环境(如浏览器或Node.js)...

    JavaScript的垃圾回收机制与内存管理

    JavaScript的垃圾回收机制是编程中一个至关重要的概念,特别是在处理大量数据或运行长时间运行的脚本时。了解这一机制有助于防止内存泄漏,提高程序效率,从而优化整体性能。本文将深入探讨JavaScript中的垃圾回收...

    js垃圾回收.pdf

    JavaScript垃圾回收机制是一种自动管理内存的方法,它负责识别并释放不再使用的内存,从而避免浪费系统资源。这个过程对于开发者来说是透明的,但它对程序性能有很大影响,特别是当处理大量数据或长时间运行的应用时...

    【JavaScript源代码】js闭包和垃圾回收机制示例详解.docx

    ### JavaScript闭包与垃圾回收机制详解 #### 一、闭包 ##### 1.1 闭包是什么? 闭包(Closure)是JavaScript中一个非常重要的概念,它涉及到函数及其相关的词法作用域。简单来说,闭包就是能够访问其自身作用域...

    Javascript内存泄露

    #### 二、JavaScript垃圾回收机制 JavaScript具有自动垃圾回收机制,当一个对象不再被任何变量引用时,该对象就会被视为“垃圾”,由垃圾回收器自动回收。例如: ```javascript var arr = [1, 2, 3]; arr = null; ...

    cpp-从blink里剥离的垃圾回收组件能让c拥有java一样的自动垃圾回收机制

    标题中的“cpp-从blink里剥离的垃圾回收组件能让c拥有java一样的自动垃圾回收机制”表明,这个项目或代码库是关于将源自Web浏览器引擎Blink的垃圾回收(Garbage Collection, GC)技术应用于C++,以实现类似Java的...

    牛客-数据存储与垃圾回收

    4.2 JavaScript垃圾回收的方式 JavaScript中的垃圾回收机制主要有两种方式:调用栈中的垃圾回收方式和堆中的垃圾回收方式。 4.3 调用栈中的垃圾回收方式 对于栈中的垃圾回收,函数执行完毕直接弹出,但是由于变量...

    JavaScript API速查手册.zip

    深入理解JavaScript垃圾回收机制、事件循环、微任务和宏任务,以及如何利用`setTimeout`的优先级、避免全局变量、减少DOM操作等来优化代码性能。 这份JavaScript API速查手册详细地介绍了JavaScript编程中的各种...

Global site tag (gtag.js) - Google Analytics