浏览器-垃圾回收

一、内存存放机制

JavaScript是动态语言(执行过程中检查数据类型的语言)、弱类型语言(偷偷得隐式类型转换的语言)

内存空间:代码空间 (存储执行代码) 、栈空间 (也就是执行上下文栈,存储执行上下文。原始类型(string、number、bigint、symbol、boolean、undefined、null)的值也存储在这里,对象类型存储了个对中对一个引用地址而已 )、堆空间(存储引用类型的值)

注意:有空看看浏览器原理与实践的第12课

二、如何垃圾回收

1、栈空间:使用ESP的指针进行切换进行垃圾回收

2、堆空间:
代际假说:第一大部分对象活得很短。第二有一些对象活得很久。

所以堆中分为两个新生代区域:生存时间短的(使用副垃圾回收器)、老生代区域:生存时间长的(使用主垃圾回收器)

2.1、堆空间中的新生代区域的副垃圾回收器怎么垃圾回收的。
首先,新生代区域分为对象区域、空闲区域。新加入的对象都会存储在对象区域,然后快满的时候,执行垃圾回收。

开始标记垃圾,然后把里面存活的对象复制到空闲区域有序得拍列起来,然后两块区域进行反转。角色互变,这样实现垃圾回收。

2.2、堆空间中的老生代区域的主垃圾回收器怎么垃圾回收的。
它采用的是标记-清除算法进行垃圾回收。标记出活动对象和垃圾数据,然后再把垃圾数据清除掉。

这个时候开始出现碎片,会使得大对象无法分配到连续的内存。所以使用标记-整理算法,把它跟前面一种算法不一样,它不是直接清除垃圾数据,而是把活动对象往一端移动,最后再清除掉边界以外的内存。

如果我们垃圾回收时占用主线程太多时间的话,我们为了不造成卡顿的现象,使用标记和js逻辑交替执行的方式进行:增量标记算法。这样把垃圾回收的任务就拆分成多个小任务了,也不会让用户因垃圾回收而感觉页面卡顿。

注意:有空看看浏览器原理与实践的第13课

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享