浅谈垃圾回收机制

2024-01-18 20:21:02 浏览数 (2)

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)。
* 这一做法适用于大多数全局变量和全局对象的属性。
* 局部变量会在它们离开执行环境时自动被解除引用。

0 人点赞