Javascript垃圾回收机制
什么是垃圾回收机制
JavaScript具有垃圾收集器,垃圾收集器会按照固定的时间间隔周期性的执行。
最常见的垃圾回收方式有两种:
- 标记清除
- 引用计数
-
标记清除
标记清除的工作原理是:
是当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。
实现标记做法的主要步骤如下:
- 创建一个根对象,例如window对象;
- 遍历根对象及其所有引用的对象,并标记它们是可达对象;
- 遍历内存中所有对象,如果发现某个对象未被标记,就将其清除。
- 在JavaScript中,标记清除算法是由浏览器自动完成的,开发者无需手动实现。
引用计数
- 引用计数(Reference Counting)的工作原理是:垃圾回收器会记录每个对象被引用的次数,当对象被引用的次数为0时,就将该对象清除。该算法的优点是实现较为简单,但无法处理循环引用的情况,可能会导致内存泄漏。
-
实现引用计数(Reference Counting)算法的主要步骤如下:
- 1声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值的引用次数就是1。
- 2.当对象被引用时,引用计数器加1;
- 3.当引用计数器为0时,就将该对象清除。
- 4.当垃圾收集器下一次运行时,它就会释放引用次数是0的值所占的内存。
-
引用计数机制是指对于每个对象,都会记录有多少个引用指向它。当引用指向这个对象的数量为0时,垃圾回收器就会将其回收。比如下面的代码:
-
var a = {};
-
var b = {};
-
a.b = b;
-
b.a = a;
-
这段代码中,变量a和变量b互相引用,形成了一个循环引用。如果采用引用计数机制,垃圾回收器就无法回收这两个变量,因为它们的引用计数永远不会为0。
总结
内存没有释放或释放及时会造成内存泄漏。
垃圾回收机制的常用方式是标记清除和引用计数。
查看内存泄漏可以通过浏览器和命令行的方式。
在JavaScript中,垃圾回收机制主要采用标记清除和引用计数两种机制。标记清除机制可以处理循环引用的情况,但是比较消耗资源;引用计数机制不能处理循环引用的情况,但是比较轻量级。实际上,现代的JavaScript引擎一般采用两种机制的结合,以达到更好的垃圾回收效果。