v8的垃圾回收机制

63 阅读2分钟

垃圾回收机制主要是用来管理内存的,防止内存泄漏。可以说一下内存泄漏有哪些。

v8引擎采用分代垃圾回收机制,将内存分为新生代和老生代。

新生代中的对象一般存活时间一般比较短。里面分为一半from空间和to空间。新的对象首先会进入到from空间中,当from空间占满时就会触发scavenge算法,会将from中存活的对象复制到to空间中,清空from空间的失活对象,然后交换from和to空间的角色。这样基于scavenge的垃圾回收就完成了。

老生代中对象一般存活时间比较长且数量比较多。首先说一下什么对象会出现在老生代中。如果新生代中对象经过一次scavenge算法,就会从新生代空间转成老生代对象。另外如果to空间的对象占比大小超过25%就会优先新生代中的对象转到老生代。

老生代的垃圾回收机制使用了两个算法分别是标记-清除和标记-紧凑两个算法。在标记-清除算法中,会从根对象触发遍历并标记所有存活的对象,然后回收未标记对象的内存,这样存在一个缺点就是内存碎片化。在标记-紧凑算法中,在标记完成后会将存活对象移到内存的另一端,消除碎片。这样做的优点就是可以减少碎片,提高内存效率,缺点就是比较耗时。

常见的优化技术有:并行回收,使用多个辅助线程并行执行垃圾回收任务。写屏障,记录老生代对象对新生代对象的引用,避免跨代引用导致的错误回收。还有就是增量标记,将标记过程分解成多个小步骤,穿插在javascript主进程中执行。这些都能提高垃圾回收的效率。