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 ''
}
- 时间开销大,资源消耗较大
维护一个引用数值,时刻监听着对象的引用数值是否需要修改,而对象的引用数值修改本身就需要时间。当有更多的对象的引用数值需要修改的时候,时间的消耗就会更大
标记清除算法
- 核心思想:分标记和清除两个阶段完成
- 遍历所有对象并标记活动对象(可达对象)
- 遍历所有对象清除没有标记的对象,并把第一阶段的标记给抹掉
- 回收相应空间,并交给空闲链表进行维护

标记清除算法优缺点
优点:
- 可以回收循环引用的对象
缺点:
- 容易产生碎片化空间,浪费空间
产生多个地址不连续的内存空间。比如释放了一个1个单位和一个2个单位的内存空间,但是后面申请了一个1.5个单位的内存空间,前面所释放的内存都不适用 - 不会立即回收垃圾对象,清除垃圾对象时程序暂停
标记整理算法
- 标记清除可以看作是标记清除的增强
- 标记的阶段和标记清除一致
- 清除阶段会先执行整理,移动对象位置



标记整理算法优缺点
优点:
- 减少碎片化空间
缺点:
- 不会立即回收垃圾对象
网友评论