Golang和Java的垃圾回收机制
参考解析
题目来源:Amber Group
答案:
golang在1.8GC之后采用三色标记法与混合写屏障技术
三色分别指白色,黑色,灰色
白色表示没有被扫描到的对象,黑色表示活跃的对象,灰色状态在白色与黑色之间
三色标记算法分五个步骤
- 将所有的对象标记为白色
- 从根节点出发,将第一次遍历到的节点标记为灰色
- 遍历节点,将灰色节点遍历到的白色节点标记为灰色,把遍历到的灰色节点标记为黑色
- 循环执行该过程
- 直到没有灰色节点,回收所有白色节点
屏障机制分为插入屏障和删除屏障,插入屏障实现的是强三色不变式,删除屏障则实现了弱三色不变式。值得注意的是为了保证栈的运行效率,屏障只对堆上的内存对象启用,栈上的内存会在GC结束后启用STW重新扫描。
插入屏障:对象被引用时触发的机制,当白色对象被黑色对象引用时,白色对象被标记为灰色(栈上对象无插入屏障)。
JAVA的GC采用分代收集算法
就是将 对象的内存周期划分为几块,按照每块的情况采取不同的垃圾回收算法。
一般是把Java堆分为新生代和老年代。
年轻代:年轻代用来存放新近创建的对象,年轻代中存在的对象是死亡非常快的。存在朝生夕死的情况。
老年代:老年代中存放的对象是存活了很久的对象。
垃圾回收算法分为三种,分别为标记-清除算法,复制算法,标记-整理算法(注:这三种算法本文只是简单介绍,详细信息可以参考Java 垃圾回收机制与几种垃圾回收算法)。
标记-清除算法:标记无用对象,然后对其进行清除回收。
复制算法:将内存区域划分为大小相等的两部分,每次只使用一部分,当该部分用完后将其存活的对象移至另一部分,并把该部分内存全部清除。
标记-整理算法:标记无用对象,让所有存活的对象都向内存一端移动,然后清除掉存活对象边界外的内存区域。