说一下浏览器垃圾回收机制?
浏览器根据数据的存储方式分为栈垃圾回收和堆垃圾回收
栈垃圾回收:
当一个函数执行完毕后,其ESP(记录当前函数状态的指针)会下移指向下一个函数,这个下移操作即视为对上一个执行完毕的函数销毁其执行上下文
堆垃圾回收:
处理完栈空间的回收,堆空间的数据依然存在,这就需要垃圾回收器回收,根据数据生命周期的不同会采用不同算法
V8会将堆空间分为新生代和老生代两个区域,新生代中存放生存时间短的对象;老生代中存放生存时间长的对象
副垃圾回收器负责对新生代区域的垃圾回收;采用Scavenge算法,将新生代区域分成对象区域和空闲区域,当对象区域快满时执行一次垃圾清理操作,先将对象区域的垃圾进行标记,之后进入垃圾清理阶段,副垃圾回收器会将存活的对象复制到空闲区域,并重新整理排序,在复制之后会将对象区域和空闲区域反转,在每次清理操作后都会反转,因此新生代区会一直存在
主垃圾回收器负责对老生代区域的垃圾回收;采用标记--清除算法和标记--整理算法
标记--清除算法是在标记阶段遍历整组根元素,能够到达的为活动对象,没有到达的就是垃圾数据,垃圾清理阶段就是清除这些垃圾数据
此算法会产生大量不连续的内存碎片,这会导致大的对象分不到连续的存储空间,因此产生了标记--整理算法
标记--整理算法和标记--清除算法的标记过程一样,整理是让标记的对象向内存的一段移动,清除掉端以外的垃圾数据
由于js是单线程的,一旦开始执行垃圾回收算法就会导致正在运行的脚本暂停下来,这叫做全停顿;为了降低这种卡顿,V8将标记过程分成一个个子过程,同时让垃圾标记过程和js应用逻辑交替执行,直到标记阶段完成,这种算法为标记增量算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用