1.垃圾回收机制是什么?
在计算机科学中,垃圾回收是一种自动的内存管理机制。当一个电脑上的动态内存不再需要时,就应该予以释放,以让出内存,这种内存资源管理,称为垃圾回收。 在JavaScript中,局部变量只有在函数的执行过程中存在,而在这个过程中会为局部变量在(栈或堆)内存上分配相应的空间,以存储它们的值,然后在函数中使用这些变量,直到函数结束。而一旦函数执行结束,局部变量就没有存在必要了,此时javascript就会通过垃圾回收机制自动释放它们所占用的内存空间。
2.多学一招
但是在开发中若要保留局部变量的值,可以通过以下两种方式实现,具体实例如下:
代码语言:javascript复制//第一种方式:利用return返回
function test(num){
num = num 1;
return num;
}
var num = test(24);
console.log(num);//输出结果:25
代码语言:javascript复制//第二种方式:利用全局变量保存
var memory;
function test(num){
memory = num 1;
}
test(24);
console.log(memory);//输出结果:25
3.什么是垃圾:
一般来说,没有被引用的对象就是垃圾,就要被清除。 有个例外,如果几个对象引用形成一个环,它们互相引用,但是根访问不到它们,这几个对象也是垃圾,也要被清除。
4.垃圾收集机制的原理:
找出那些不再继续使用的变量,然后释放其占用的内存。 为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性地执行这一操作。
5.垃圾回收的方法
1、标记清除(Mark-Sweep GC)
代码语言:javascript复制* 标记阶段:从根集合出发,将所有活动对象及其子对象打上标记
* 清除阶段:遍历堆,将非活动对象(未打上标记)的连接到空闲链表上
* 优点
* 实现简单,容易和其他算法组合
* 缺点
* 碎片化,会导致无数小分块散落在堆的各处
* 分配速度不理想,每次分配都需要遍历空闲列表找到足够大的分块
* 与写时复制技术不兼容,因为每次都会在活动对象上打上标记
2、引用计数(Reference Counting)
代码语言:javascript复制* 引用计数,就是记录每个对象被引用的次数,每次新建对象、赋值引用和删除引用的同时更新计数器,如果计数器值为0则直接回收内存。很明显,引用计数最大的优势是暂停时间短
* 优点
* 可即刻回收垃圾
* 最大暂停时间短
* 没有必要沿指针查找,不用和标记清除算法一样沿着根集合开始查找
* 缺点
* 计数器的增减处理繁重
* 计数器需要占用很多位
* 实现繁琐复杂,每个赋值操作都得替换成引用更新操作
* 循环引用无法回收
3、其它算法
代码语言:javascript复制* 标记-压缩(Mark-Compact)
* GC复制算法
* 保守式GC
* 分代回收
* 增量式GC
* 三色标记算法
6.解除引用
代码语言:javascript复制* 一旦数据不再有用,最好通过将其值设置为null来释放其引用,这个做法叫做解除引用(dereferencing)。
* 这一做法适用于大多数全局变量和全局对象的属性。
* 局部变量会在它们离开执行环境时自动被解除引用。