- 什么是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