JS 垃圾回收

内存

JS 数据的存储地址分为栈内存堆内存

栈内存
  存放基础数据类型(如: String Number Boolean Symbol)以及函数和对象的引用地址
堆内存
  存放对象的具体值

在 JS 存放数据的内存中又分为高位低位,其中高位存放栈数据,低位存放堆数据,堆数据不可控数据的大小。

垃圾回收(Garbage Collection)

堆数据的垃圾回收

在堆数据中,又分为新生代数据老生代数据,新生代数据是指新创建的数据,老生代是指在新生代数据中被标记存活下来的数据,也就是上一次扫描中没有被清理掉的数据,老生代不容易被回收。

对于新生代数据使用 scavenge 算法。具体是将新生代数据的内存一分为二,分别为 fromto

第一次创建的堆数据将进入 from 中。from 中的数据如果满了,将进行一次 GC 。也就是对 from 中的堆数据遍历一次进行标记清除。标记的数据将全部拷贝到 to 中,然后清除掉 from 中的数据。然后再次新创建的数据将放到 to 中。如果 to 的内存满了,又会进行一次 GC。上一次 GC 中被标记的数据将进入到老生代内存中。也就是说新生代的数据有一部分晋升了。

对于老生代数据的垃圾回收是标记清楚+标记整理
老生代内存满了会触发一次 GC,遍历一遍老生代数据,删除没有被使用的数据。剩余的数据段会存在不连续,还有内存,分配不了大数据的问题。所以会进行标记整理,也就是对老生代数据进行移动整合内存段,但是这样会造成浏览器卡顿。所以会进行增量标记增量整理,每次只移动一段。

你可能感兴趣的:(JS 垃圾回收)