js垃圾回收机制——GC算法(个人笔记)

javaScript中的垃圾


  • javaScript中内存管理是自动的
  • 对象不再被引用时是垃圾
  • 对象不能从根上访问到时是垃圾

javaScript中的可达对象


  • 可以访问到的对象就是可达对象(引用、作用域链)
  • 可达的标准就是从根出发是否能够被找到
  • javaScript中的根可以理解为是全局变量对象

GC算法介绍


GC介绍与作用
  • GC就是垃圾回收机制的简写
  • GC可以找到内存中的垃圾,并进行释放和回收空间

常见GC算法


  • 引用计数
  • 标记清除
  • 标记整理
  • 分代回收

引用计数算法

  • 核心思想:为每个对象设置引用数,判断当前引用数是否为0
  • 引用计数器
  • 引用关系变化时引用计数器会修改引用数字
  • 引用数字为0时立即回收

引用计数算法优缺点

优点:

  • 发现垃圾时立即回收
  • 最大限度减少程序暂停
    运行内存都是有限的,引用计数算法会根据引用数字为0立即释放内存,避免达到内存上限

缺点:

  • 无法回收循环引用的对象
    例子中obj1和obj2是循环引用的对象,引用数值不会是0,所以不会被回收
function fn() {
    const obj1 = {}
    const obj2 = {}
    obj1.name = obj2
    obj2.name = obj1
    return ''
}
  • 时间开销大,资源消耗较大
    维护一个引用数值,时刻监听着对象的引用数值是否需要修改,而对象的引用数值修改本身就需要时间。当有更多的对象的引用数值需要修改的时候,时间的消耗就会更大

标记清除算法

  • 核心思想:分标记和清除两个阶段完成
  • 遍历所有对象并标记活动对象(可达对象)
  • 遍历所有对象清除没有标记的对象,并把第一阶段的标记给抹掉
  • 回收相应空间,并交给空闲链表进行维护
image.png

标记清除算法优缺点

优点:

  • 可以回收循环引用的对象

缺点:

  • 容易产生碎片化空间,浪费空间
    产生多个地址不连续的内存空间。比如释放了一个1个单位和一个2个单位的内存空间,但是后面申请了一个1.5个单位的内存空间,前面所释放的内存都不适用
  • 不会立即回收垃圾对象,清除垃圾对象时程序暂停

标记整理算法

  • 标记清除可以看作是标记清除的增强
  • 标记的阶段和标记清除一致
  • 清除阶段会先执行整理,移动对象位置
image.png
image.png
image.png

标记整理算法优缺点

优点:

  • 减少碎片化空间

缺点:

  • 不会立即回收垃圾对象
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容