v8引擎如何垃圾回收

137 阅读2分钟
  1. 垃圾回收策略一般分为手动回收(C、C++)、自动回收(JS、JAVA、Python),这样可以减轻程序员的负担,但也造成了困惑,误以为不用注意内存分配的问题。

  2. JS的原始数据类型和引用数据类型分别存储在栈空间和堆空间中,由于栈和堆的大小不同,采用的回收机制也不同,

  3. 栈的垃圾回收机制是通过下移指针(ESP)来释放内存,原来如下:

    • 当ESP下移到下一个上下文时,上一个上下文会被标记为无用的内存空间,这时压进栈的函数会直接替换无用的内存空间
  4. 堆空间的垃圾回收机制是:垃圾回收器

    • 垃圾回收器的工作流程是:标记-清理-整理,标记活动对象(被引用的)和非活动对象(可回收的),

      清理可回收的对象,由于多次垃圾回收后产生内存碎片会导致大的对象无法存储所以要进行整理内存碎片

    • v8引擎把堆空间分为新生代和老生代两个区域,新生代存储生存时间短的,老生代存储生存时间长的,新生代的容量一般在1至8M,老生代会更多

    • 垃圾回收器分为:副垃圾回收器-处理新生代垃圾;主垃圾回收器-处理老生代垃圾

    • 副垃圾回收器采用scavenge算法将存储区域分为对象区域和空闲区域,通过两块区域反转让新生代区域无限使用下去,通过晋升策略(两次未清除的)大对象晋升到老生代区域

    • 主垃圾回收器采用标记-清除(Mark-Sweep)算法进行垃圾回收