当前位置:首页 > 内存 > 正文

js的内存回收机制

  • 内存
  • 2024-06-05 02:08:30
  • 162

一、4种垃圾回收机制的比较引用计数(ReferenceCounting)是一种算法,为每个对象统计指向它的指针指向1的数量。如果值的数量减少到0,说明不再有指向该对象的指针,可以被安全地摧毁。直观上可以用下图来表达:
但是如果关系是循环的,链的圆度中相关的事物数量不能变成0,这种情况就不能RECYCLED
优点:
缺点:
标记清除算法是基于对所有存活对象的全局遍历来确定哪些对象可以被回收,一个遍历过程。他从根源开始,找到所有可以触及的物体。
整个过程分为两步:
执行过程如:
内存中新事物的布局如图:<缺点:
通过清理不连续对象的垃圾可以看到内存
优点:
缺点:
因为字符和清除算法有一个比较大的问题,那就是内存碎片的原因是内存清理算法的增强。抽奖的标记和周期内存变化如下:
可以清空内存看看垃圾对象是连续的
回收生成算法不会事情。具体的GC回收算法,而是多种GC回收算法的组合,包括:
本文讲解V8引擎的垃圾回收。
首先,回收代算法会将内存对象分为新生代和老年代:
对象进入新生代的代数比例。主要通过Scavenge算法进行处理。在Scavenge的具体实现中,主要使用切尼算法。
切尼算法是一种通过复制实现的垃圾收算法。他将内存分为两部分,每一部分的空间称为半空间。两个半空间中,只有一个正在使用,另一个闲置。正在使用的空间称为semispace、A空间,空闲空间中的空间称为Ad空间。当我们放置一个物体时,我们首先将它放置在A空间中。当垃圾收集开始时,幸存的对象将被压入Ex空间。这些幸存的对象将被复制到空间中,并且该空间将从非幸存的对象中释放。图案完成后,部件将转换为A空间和A空间。
Scavenge的缺点是只能使用一半的内存堆,这是由划分和空间机制决定的。然而,Scavenge在时间上达到了最好的效率,因为只有幸存的样本被反对,并且只有一小部分幸存的项目被用于生命周期较短的场景。
由于Scavenge是一种典型的牺牲时间的算法,因此它不能全面应用于所有的垃圾收集。但可以发现Scavenge非常适合应用在新生代中,因为新生代中对象的生命周期较短,正好适该算法。
Scavenge算法内存的目的:
新生代GC过程如下:
那些已经在oldGeneration中的地区,必须使用最知名、最明确的方法。最重要的是,在移动数据之前,首先检查是否有足够的空间,如果有,则直接存储。然后更换引擎
V8引擎其实垃圾收集是增量进行的,回收过程分为很多子过程。>下一篇:JS优化性能