V8实现了精准式GC,采用分代式垃圾回收机制,将内存(堆)分为“新生代”、“老生代”两部分。
新生代算法
- 对象存活时间短,使用 Scavenge GC 算法
- 内存空间分为
Form
、To
空间,这两个必然是其中一个在使用,而另一个空闲。新分配对象会存储在From
中,当From
被占满,启动新生代GC,将活跃的对象复制到To
中,并将失活对象销毁;复制完成后,From
和To
空间互换,这样GC就结束了。
老生代算法
- 对象存活时间长,有两种算法:1、标记清除法 2、标记压缩法
- 使用情况:1、新生代中对象已经经历过一次 Scavenge GC 算法,移入老生代空间;2、To空间对象占比超过25%,为不影响内存,移到老生代空间中。
RO_SPACE, // 不变的对象空间
NEW_SPACE, // 新生代用于 GC 复制算法的空间
OLD_SPACE, // 老生代常驻对象空间
CODE_SPACE, // 老生代代码对象空间
MAP_SPACE, // 老生代 map 对象
LO_SPACE, // 老生代大空间对象
NEW_LO_SPACE, // 新生代大空间对象
- 标记清除法启动条件
某一个空间没有分块的时候
空间中被对象超过一定限制
空间不能保证新生代中的对象移动到老生代中
这个过程会遍历所有对象,将活跃的对象进行标记,最后销毁没有被标记的对象;清除过程中会产生一些碎片,当碎片超过一定限制,启动压缩算法:将活的对象向一边移动,直到所有的移动完毕,清除掉不需要的内存
网友评论