Appearance
V8 引擎的垃圾回收机制
本节目标:理解“V8 引擎的垃圾回收机制”的核心思路,并能把它用于实际开发或面试表达。 ==v8== ==的垃圾回收机制基于分代回收机制,这个机制又基于世代假说,这个假说有两个特点,一是新生的对象容易早死,另一个是不死== ==的对象会活得更久。基于这个假说,====v8== ==引擎将内存分为了新生代和老生代。======
==新创建的对象或者只经历过一次的垃圾回收的对象被称为新生代。经历过多次垃圾回收的对象被称为老生代。== ==新生代被分为== ==From== ==和== ==To== ==两个空间,====To== ==一般是闲置的。当== ==From== ==空间满了的时候会执行== ==Scavenge== ==算法进行垃圾回收。当我们执行垃圾回收算法的时候应用逻辑将会停止,等垃圾回收结束后再继续执行。这个算法分为三步:====== ==(====1====)首先检查== ==From== ==空间的存活对象,如果对象存活则判断对象是否满足晋升到老生代的条件,如果满足条件则晋升到老生代。如====== ==果不满足条件则移动== ==To== ==空间。====== ==== ==(====2====)如果对象不存活,则释放对象的空间。====== ==(====3====)最后将== ==From== ==空间和== ==To== ==空间角色进行交换。====== ==新生代对象晋升到老生代有两个条件:====== ==(====1====)第一个是判断是对象否已经经过一次== ==Scavenge== ==回收。若经历过,则将对象从== ==From== ==空间复制到老生代中;若没有经历,则====== ==复制到== ==To== ==空间。== ==(====2====)第二个是== ==To== ==空间的内存使用占比是否超过限制。当对象从== ==From== ==空间复制到== ==To== ==空间时,若== ==To== ==空间使用超过== ==25%====,则对====== ==象直接晋升到老生代中。设置== ==25%== ==的原因主要是因为算法结束后,两个空间结束后会交换位置,如果== ==To== ==空间的内存太小,会====== ==影响后续的内存分配。== ==老生代采用了标记清除法和标记压缩法。标记清除法首先会对内存中存活的对象进行标记,标记结束后清除掉那些没有标记的对象。由====== ==于标记清除后会造成很多的内存碎片,不便于后面的内存分配。所以了解决内存碎片的问题引入了标记压缩法。== ==由于在进行垃圾回收的时候会暂停应用的逻辑,对于新生代方法由于内存小,每次停顿的时间不会太长,但对于老生代来说每次垃圾回====== ==收的时间长,停顿会造成很大的影响。== ==为了解决这个问题== ==V8== ==引入了增量标记的方法,将一次停顿进行的过程分为了多步,每次执行====== ==完一小步就让运行逻辑执行一会,就这样交替运行。== ==详细资料可以参考:== ==《深入理解== ==V8== ==的垃圾回收原理》== ==《====JavaScript== ==中的垃圾回收》== > 来自
<https://github.com/CavsZhouyou/Front-End-Interview-Notebook/blob/master/JavaScript/JavaScript.md>