一、什么是JavaScript垃圾回收机制
1.垃圾回收机制(Garbage Collction)简称GC,是JavaScript中使用的内存管理系统的基本组部分,是为了防止内存泄漏
2.JavaScript是在创建变量(对象、字符串等)时自动进行了分配内存,并且在不使用他们时会自动释放
3.内存在不适用的时候就被垃圾回收器自动回收
二、为什么会存在垃圾回收机制
1、程序的运行过程中会申请大量的内存空间
2、对于一些无用的空间如果不及时清理的话会导致内存溢出(不够用),程序就会崩溃
3、管理内存是非常复杂的事情,垃圾回收机制就把程序员从复杂的内存管理中解放出来
三、引用计数(reference counting)
在内存管理环境中,对象 A 如果有访问对象 B 的权限,叫做对象 A 引用对象 B。引用计数的
策略是将“对象是否不再需要”简化成“对象有没有其他对象引用到它”,如果没有对象引用这个对
象,那么这个对象将会被回收;话不多说,上代码!!!
var obj1 = { a : 1 }; // 一个对象(称之为 a)被创建,赋值给 obj1,a 的引用个数为 1
var obj2 = obj1; // 将 obj1 重新赋值给 obj2,此时 a 的引用个数为 2
obj1 = 0; // a 的引用个数变为 1
obj2 = 0; // a 的引用个数变为 0,此时对象 a 就可以被垃圾回收了
但是 引用计数有个最大的问题 : 循环引用;
function func() {
var obj1 = {};
var obj2 = {};
obj1.a = obj2; // obj1 引用 obj2
obj2.a = obj1; // obj2 引用 obj1
}
当函数 func 执行结束后,返回值为 undefined,所以整个函数以及内部的变量都应该被回收,但根
据引用计数方法,obj1 和 obj2 的引用次数都不为 0,所以他们不会被回收。
所以 要解决循环引用的问题,最好是 在不使用它们的时候手工将它们设为空
obj1 = null; // 将 obj1 的值手动置为 空
obj2 = null; // 将 obj2 的值手动置为 空
四、标记清除法 (Mark and Sweep)
标记清除法 处理循环引用的情况是通过 标记 和 清除 两个阶段来完成的
1、在标记阶段,垃圾回收器会从根对象开始遍历内存中的所有对象,标记所有可达对象,而对于
不可达的对象,则不进行标记。
2、在清除阶段,垃圾回收器会清除所有未被标记的对象,从而释放它们占用的内存空间,便于进
行下一次垃圾回收操作
在处理循环引用的情况时,标记清除算法会通过特殊的标记方式来标记循环引用的对象。
具体来说,在标记阶段,垃圾回收器会将循环引用的对象标记为“可达”,并且在遍历过程中不会重
复标记已经被标记过的对象。
在清除阶段,由于循环引用的对象被标记为“可达”,因此不会被清除,从而保证了循环引用的正确
处理。