垃圾回收
垃圾回收

垃圾回收

  • 什么是GC

js的引用类型是通过栈内存的一个变量引用堆内存分配的对象,当把这个变量重新赋值之后,堆内存分配的对象就会被GC

  • GC算法:标记清除算法

在GC运行时将所有对象标为0,表示都是要被清除的对象,从根对象出发去遍历对象,将这些对象重新标为1,最后仍为0的对象就会清除

  • GC优化

新生代区

因为每次垃圾回收都要遍历一次对象,对老,大,存活时间长和新,小,存活时间短的对象,划分为新生代和老生代

新生代区将分为两个区,一个是使用区,一个是空闲区

进入GC阶段时,对使用区中的活动对象做标记,标记完成之后将使用区的活动对象复制进空闲区并进行排序,随后进入垃圾清理阶段,即将非活动对象占用的空间清理掉,最后进行角色互换,把原来的使用区变成空闲区,把原来的空闲区变成使用区

当一个对象经过多次复制后依然存活,它将会被认为是生命周期较长的对象,随后会被移动到老生代中,采用老生代的垃圾回收策略进行管理

另外还有一种情况,如果复制一个对象到空闲区时,空闲区空间占用超过了 25%,那么这个对象会被直接晋升到老生代空间中,设置为 25% 的比例的原因是,当完成 Scavenge 回收后,空闲区将翻转成使用区,继续进行对象内存的分配,若占比过大,将会影响后续内存分配

老生代区

  • 并行回收
  • 可暂停/恢复(三色标记,恢复至灰色节点继续遍历)
  • 写锁(将新改的引用对象标记为灰色)
  • 并发回收

reference:

https://juejin.cn/post/6981588276356317214

https://www.ditdot.hr/en/causes-of-memory-leaks-in-javascript-and-how-to-avoid-them

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注