今天下午看了看v8的垃圾回收机制,拿出来小小的分享一下,说的不对别喷我,不过欢迎指教。
v8把所有的内存按照对象的生命周期分为短生命周期和长生命周期两块,长生命周期比短生命周期获得的内存量要多,短生命周期部分的内存又分为From和To两个相等大小的内存,在执行垃圾回收的时候首先会把From中存活有效的对象复制到To内存块中,然后销毁From中的内容,之后进行反转,就是把To的内容放到From中,等待下一次的垃圾回收,这就是所谓的Scavenge算法,第二次以及之后执行垃圾回收的时候,会对from中的对象进行判断,如果该对象已经进行过一轮Scavenge,那么该对象会被认为生命周期很长而存到长生命周期的那块内存块中,另外如果,在复制该对象去to之前,to的大小已经超过了其25%,该对象也会被直接晋升到长生命周期内存中,如果不满足以上两个条件,就会继续执行Scavenge,在长生命周期做垃圾回收的时候会将存活的对象标记,然后将未标记的部分往后移,之后清理掉未标记的部分的内存边界和内存,形成一个完整,连续的内存空间。其中标记存活对象,删除未标记对象的动作叫mark sweep,而将未标记部分重新整理的动作叫mark compact,由于mark compact会消耗相当多的性能,所以只有当所剩内存空间无法容纳新晋升对象的时候才会执行。另外可以看到scavenge是复制存活的对象,而mark sweep是删除不用的对象,原因是因为短生命周期中存活对象较少,而长生命周期中已死(不再使用的对象)较少。