JS 垃圾回收
2020-12-12 本文已影响0人
弹指一挥间_e5a3
内存
JS 数据的存储地址分为栈内存
和堆内存
。
栈内存
存放基础数据类型(如: String Number Boolean Symbol)以及函数和对象的引用地址
堆内存
存放对象的具体值
在 JS 存放数据的内存中又分为高位
和低位
,其中高位存放栈数据,低位存放堆数据,堆数据不可控数据的大小。
垃圾回收(Garbage Collection)
堆数据的垃圾回收
在堆数据中,又分为新生代数据
和老生代数据
,新生代数据是指新创建的数据,老生代是指在新生代数据中被标记存活下来的数据,也就是上一次扫描中没有被清理掉的数据,老生代不容易被回收。
对于新生代数据使用 scavenge
算法。具体是将新生代数据的内存一分为二,分别为 from
和 to
。
第一次创建的堆数据将进入 from
中。from
中的数据如果满了,将进行一次 GC
。也就是对 from
中的堆数据遍历一次进行标记清除
。标记的数据将全部拷贝到 to
中,然后清除掉 from
中的数据。然后再次新创建的数据将放到 to
中。如果 to
的内存满了,又会进行一次 GC
。上一次 GC
中被标记的数据将进入到老生代内存中。也就是说新生代的数据有一部分晋升了。
对于老生代数据的垃圾回收是标记清楚
+标记整理
。
老生代内存满了会触发一次 GC
,遍历一遍老生代数据,删除没有被使用的数据。剩余的数据段会存在不连续,还有内存,分配不了大数据的问题。所以会进行标记整理
,也就是对老生代数据进行移动整合内存段,但是这样会造成浏览器卡顿。所以会进行增量标记增量整理
,每次只移动一段。