浏览器根据数据的存储方式分为栈垃圾回收和堆垃圾回收
栈垃圾回收:
当一个函数执行完毕后,其ESP(记录当前函数状态的指针)会下移指向下一个函数,这个下移操作即视为对上一个执行完毕的函数销毁其执行上下文
堆垃圾回收:
处理完栈空间的回收,堆空间的数据依然存在,这就需要垃圾回收器回收,根据数据生命周期的不同会采用不同算法
V8会将堆空间分为新生代和老生代两个区域,新生代中存放生存时间短的对象;老生代中存放生存时间长的对象
副垃圾回收器负责对新生代区域的垃圾回收;采用Scavenge算法,将新生代区域分成对象区域和空闲区域,当对象区域快满时执行一次垃圾清理操作,先将对象区域的垃圾进行标记,之后进入垃圾清理阶段,副垃圾回收器会将存活的对象复制到空闲区域,并重新整理排序,在复制之后会将对象区域和空闲区域反转,在每次清理操作后都会反转,因此新生代区会一直存在
主垃圾回收器负责对老生代区域的垃圾回收;采用标记--清除算法和标记--整理算法
标记--清除算法是在标记阶段遍历整组根元素,能够到达的为活动对象,没有到达的就是垃圾数据,垃圾清理阶段就是清除这些垃圾数据
此算法会产生大量不连续的内存碎片,这会导致大的对象分不到连续的存储空间,因此产生了标记--整理算法
标记--整理算法和标记--清除算法的标记过程一样,整理是让标记的对象向内存的一段移动,清除掉端以外的垃圾数据
由于js是单线程的,一旦开始执行垃圾回收算法就会导致正在运行的脚本暂停下来,这叫做全停顿;为了降低这种卡顿,V8将标记过程分成一个个子过程,同时让垃圾标记过程和js应用逻辑交替执行,直到标记阶段完成,这种算法为标记增量算法
标签:浏览器,标记,--,回收,算法,区域,垃圾 From: https://www.cnblogs.com/qianduan-Wu/p/16664409.html