Javascript垃圾回收机制

72 阅读2分钟

本质:

定期找出那些不再用到的内存(变量),然后释放其内存

V8采用的基于分代的垃圾回收,V8把内存空间分成了两个部分,新生代存储区和老生代存储区

新生代对象回收实现

采用cheney算法+标记管理,首先内存会区分两个等大的小空间,其中使用空间为from,空闲空间为To。

老生代对象回收实现

老生代对象回收过程采用的是标记清楚,标记整理,增量标记算法,首先使用标记清除完成垃圾空间的回收,这样就会产生空间碎片,当新生代晋升的时候,老生代内存不足的时候,会触发标记整理进行空间优化。增量标记是用来进行效率优化的。

标记增量如何优化垃圾回收

当程序执行过程中,触发了GC操作,这时遍历对象进行标记,如果不使用标记增量,这段时间会标记对象的第一层,然后第二层,然后第三层。。。。最后进行的清除操作,会阻塞很久,对用户体验不好。这时使用标记增量,会先遍历对象的第一层,程序执行,遍历第二层,程序执行,最后在进行清除,这样就不会阻塞很长时间,对用户比较好的体验。

总结:

V8是目前主流的JS引擎,内存上有限,采用新生代和老生代进行垃圾回收,新生代采用的复制算法+标记管理的方式进行对象回收,用空间换时间。老生代是用的是标记清除,标记整理,增量标记算法进行对象回收,分批进行标记最后回收,提高了用户的体验。