js中的垃圾回收机制

·  阅读 212

在编程的世界中,内存分配每时每刻都在发生,从底层来讲,可以分为三类

image.png

标记清除法

算法分为两个阶段, 第一个阶段是标记, 从一个GC root集合出发,沿着“指针”找到所有活动对象

image.png

到了清除阶段,只需要把那些没有被标记的对象删除,释放空间就行。 image.png

标记-清除算法非常简单,容易实现,现在垃圾收集算法都是它的思想的延续。

标记清除法存在的缺点

可是标记-清除算法也有两个要命的缺点:分配速度慢,容易产生碎片。

image.png

复制算法

复制算法需要把整个空间平均分成两部分, 先在From空间进行分配,当From空间被占满,GC将活动对象复制到To空间, 复制完成后, From和To进行互换

image.png

复制算法的第一步也是标记,但是找到活动对象以后,直接复制到另一半空间,所以能在较短时间内完成GC。

并且每次复制的时候,对象都会集中,避免碎片。

复制算法缺点

image.png

标记-清除算法和复制算法优缺点都非常明显;

引用计数

image.png

引用计数缺点

引用计数法有个缺点,就是它不能回收“循环引用”

image.png

回收规则(大部分对象的生存期限很短,生下来不久就变成垃圾)

于是把对象进行分代,对不同的分代实施不同的垃圾收集算法

使用垃圾回收算法就多了解释器编译器额外的开销

GC把程序员从内存管理中解放出来,世界上没有免费的午餐,付出的代价就是多了虚拟机/解释器这一层额外的开销。

GC

GC 即 Garbage Collection 垃圾收集

js回收策略

在 JavaScript 内存管理中有一个概念叫做 `可达性`,就是那些以某种方式可访问或者说可用的值,它们被保证存储在内存中,反之不可访问则需回收
复制代码

        至于如何回收,其实就是怎样发现这些不可达的对象(垃圾)它并给予清理的问题, JavaScript 垃圾回收机制的原理说白了也就是定期找出那些不再用到的内存(变量),然后释放其内存

你可能还会好奇为什么不是实时的找出无用内存并释放呢?其实很简单,实时开销太大了

V8对GC的优化

分代式垃圾回收

上面所说的垃圾清理算法在每次垃圾回收时都要检查内存中所有的对象,这样的话对于一些大、老、存活时间长的对象来说同新、小、存活时间短的对象一个频率的检查很不好,因为前者需要时间长并且不需要频繁进行清理,后者恰好相反,怎么优化这点呢???分代式就来了

新老生代

V8 的垃圾回收策略主要基于分代式垃圾回收机制,V8 中将堆内存分为新生代和老生代两区域,采用不同的垃圾回收器也就是不同的策略管理垃圾回收

新生代的对象为存活时间较短的对象,简单来说就是新产生的对象,通常只支持 1~8M 的容量,而老生代的对象为存活事件较长或常驻内存的对象,简单来说就是经历过新生代垃圾回收后还存活下来的对象,容量通常比较大

新生代垃圾回收

参考:码农翻身 # 你真的了解垃圾回收机制吗

分类:
前端
分类:
前端
收藏成功!
已添加到「」, 点击更改