V8垃圾回收?看这篇就够了! (3)

清道夫GC,主要管理新生代空间,保证新生代空间的紧凑和干净。所有的对象都会分配到新生代空间,新生代空间相对较小。大约在1M ~ 8M,可以通过命令控制。

该GC流程大致是这样:
新生代空间由两个等分的空间组成,to-space和from-space,可以把这两个名字理解为阶段(当前使用 和 当前未使用),而不是名字。当当前使用没有更多内存后,触发Minor GC。
比如,当当前使用没有更多空间了,这时候,新增了一个待分配空间对象,Minor GC会吧当前未使用切换为当前使用,然后将之前已满负荷的空间中的数据,根据是否存活整理到新的、空的当前使用中。存活的就放过去,非存活的就扔掉。并且在移动存活数据的时候,会紧凑摆放,避免空间浪费。最后吧待分配空间对象,分配到新的当前使用中。
当更多的待分配空间进来时,会重复上面流程,但是如果一个数据存活两次以上,它就会被扔到老生代空间。以保证新生代空间的新。

上面的过程可以用一个例子来概括:
小明去网吧,第一次去,有位置,直接上机。没位置,得等老板清理下到时间的机器,然后再上机。这种到时间的一般是没办卡的(非存活)。
第二次去,还是上面的流程。
第N次去,小明也办了张卡(存活)
如果小明的卡到期了,那么他也就失活了。

上面所述过程,一定要参考下这个流程图!!!

Major GC(Mark-Sweep & Mark-Compact)

该GC主要负责老生代空间的紧凑和清理。当V8知道老生代空间无更多空间的时候就会触发这个GC。上面的清道夫GC对于体积小的数据来说是完美的,但是对于体积大的来说,非也。一种更好的方式是:标记-扫描-紧凑算法,顾名思义,一共是三步。

V8垃圾回收?看这篇就够了!

不多解释。自己看图吧。

总结

以上介绍了内存的堆栈,也对比了数据结构的堆栈。
之后简析了几种GC方式和V8的具体实现。
更多深入的内容欢迎交流,互相学习。

参考

memory-management
V8内存简析
内存和数据堆栈

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzyxz.html