go内存管理-垃圾回收-学习心得
今天学习了下go内存管理中的垃圾回收,分享下心得
首先、分享下常见几种垃圾回收的机制
1、引用技术法:记录对象被引用的次数,创建时为1,每次被引用加1。每次引用被回收就减1。当计数为0时,回收该对象。
使用该机制的语言有python
优点:实现简单,对象可以很快的被回收
缺点:不能很好的处理循环引用
2、标记清除法:从根对象出发,扫描每个对象,根据其是否被引用做相应的标记。等扫描结束后,回收没有被标记的对象。
go语言就是使用的三色标记法
优点:解决了引用计数的缺点。
缺点:需要STW,即要暂时停掉程序运行。
3、分代回收:将对象分为不同分代,如老生代和新生代等,不同分代采取不同的回收算法。
优点:回收性能好
缺点:算法复杂
重点说明下go的三色标记法
其实没有所谓的三色标记,是三种状态。
灰色:对象等待处理
黑色:对象已被标记
白色:对象未被标记
回收时,首先将所有对象标记为白色。然后从根对象出发,将其标记为黑色,将其引用对象标记为灰色。直到扫描结束。然后取出所有灰色对象,将其标记为黑色,将其引用对象标记为灰色。循环这个过程。直到没有灰色对象。此时,所有存活对象都已经被标记了,回收所有白色对象。
垃圾回收触发时机
1、内存分配时检测到分配的内存时之前的一倍及以上时触发
2、默认2分钟触发一次。
3、可以手动触发 runtime.GC()
参考自go专家编程
第四章:内存管理 - 4.2 垃圾回收原理 - 《GO专家编程》 - 书栈网 · BookStack

