经常使用 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是一种动态类型的编程语言,它的内存管理主要依赖于垃圾收集机制。这个机制自动处理内存的分配和回收,使得开发者无需像在C++或C中那样手动管理内存。本文将深入探讨JavaScript中的两种主要垃圾收集策略:...
### JavaScript垃圾回收机制详解 #### 一、概述 在现代软件开发中,特别是前端领域,JavaScript 已成为不可或缺的一部分。随着应用复杂度的增加,如何有效地管理内存成为了开发者必须面对的问题之一。JavaScript ...
自动垃圾收集机制是JavaScript引擎中非常重要的一部分,它的主要任务是识别并回收那些不再使用的内存,以防止内存泄漏。本文将深入探讨JavaScript的两种主要的垃圾收集方式:标记清除和引用计数。 首先,我们来看...
JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。 不再使用的变量也就是生命周期结束...
垃圾收集器定期运行,将所有内存中的变量标记,随后移除环境中和环境内变量无法访问的那些变量的标记,这些变量被认为是可以安全清理的,其占用的内存将被回收。 其次,另一种策略是**引用计数(Reference Counting...
"Java垃圾回收机制详解" Java垃圾回收机制是Java语言的...垃圾收集机制是Java语言的核心技术之一,用于清除不再使用的对象。不同的垃圾收集器有其优缺点,选择合适的垃圾收集器对程序的性能和效率有非常重要的影响。
这个"JavaScript技巧收集.7z"压缩包很可能是包含了一系列关于JavaScript编程的实用技巧、代码片段或者示例项目。尽管没有具体的标签提供额外信息,我们可以从常见的JavaScript知识点出发,来探讨一些重要的概念和...
即使在高级语言如JavaScript中,这一问题亦可能出现,尽管它拥有垃圾收集机制来管理内存。在JavaScript中,开发者不直接进行内存分配与释放,而是依赖于垃圾收集器来自动处理。但某些情况下,垃圾收集器无法正确识别...
JavaScript的垃圾回收(Garbage Collection,简称GC)机制是编程语言中自动管理内存的重要特性,尤其是在JavaScript这样的动态语言中,它极大地简化了开发者的工作。JavaScript的执行环境会自动负责跟踪和回收不再...
理解JavaScript的深入机制意味着要探索其内存模型(如垃圾回收机制)、执行上下文、作用域链、事件循环、异步处理(如回调函数、Promise和async/await)等核心概念。其中,执行上下文是JavaScript中理解作用域和闭包...
在内存管理方面,V8采用了一种称为“垃圾收集”的机制,自动处理不再使用的内存,避免了内存泄漏。它使用分代垃圾收集策略,根据对象的生命周期将其分为年轻代和老年代,以更高效地回收内存。V8还引入了“增量垃圾...
4.2 JavaScript垃圾回收的方式 JavaScript中的垃圾回收机制主要有两种方式:调用栈中的垃圾回收方式和堆中的垃圾回收方式。 4.3 调用栈中的垃圾回收方式 对于栈中的垃圾回收,函数执行完毕直接弹出,但是由于变量...