Javascript垃圾收集机制介绍

时间:2020-11-11 14:07:43 JavaScript 我要投稿

Javascript垃圾收集机制介绍

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

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垃圾收集机制介绍】相关文章:

1.perl- javascript中class的机制

2.JavaScript toFixed方法介绍

3.Javascript高级手势使用介绍

4.javascript克隆对象深度介绍

5.JavaScript数组常用方法介绍

6.javascript的面向对象技术介绍

7.javascript中Function类型详细介绍

8.关于JavaScript中的包装对象介绍