文章目录
-
- 1.Go语言——垃圾回收
- 2.CPM调度和CSP模型
- 3.chan原理
- 4.context结构原理
- 5. 竞态、内存逃逸
- 6. golang中new和make的区别?
- 7.Go中对nil的Slice和空Slice的处理是一致的吗?
- 8.Golang的内存模型中为什么小对象多了会造成GC压力?
- 9.channel为什么能做到线程安全?
- 10.GC的触发条件
- 11.怎么查看Goroutine的数量?怎么限制Goroutine的数量?
- 12. Channel是同步的还是异步的?
- 13. Goroutine和线程的区别?
- 14. Go的Struct能不能比较?
- 15. Go的Slice如何扩容?
- 16.在Go函数中为什么会发生内存泄露?发生了泄漏如何检测?
- 17. Go中两个Nil可能不相等吗?
- 18.Go语言中的内存对齐
- 19.两个 interface 可以比较吗?
- 20.go 打印时 %v %+v %#v 的区别?
- 21.什么是 rune 类型?
- 22.空 struct{} 占用空间么?用途是什么?
1.Go语言——垃圾回收
Go V1.3之前的标记-清除:
1.暂停业务逻辑,找到不可达的对象,和可达对象
2.开始标记,程序找出它所有可达的对象,并做上标记
3.标记完了之后,然后开始清除未标记的对象。
4.停止暂停,让程序继续跑。然后循环重复这个过程,直到process程序生命周期结束
标记-清除的缺点:
STW(stop the world):让程序暂停,程序出现卡顿
标记需要扫描整个heap
清除数据会产生heap碎片
为了减少STW的时间,后来对上述的第三步和第四步进行了替换。
Go V1.5 三色标记法
1.把新创建的对象,默认的颜色都标记为“白色”
2.每次GC回收开始,然后从根节点开始遍历所有对象,把遍历到的对象从白色集合放入“灰色”集合
3.遍历灰色集合,将灰色对象引用的对象从白色集合放入到灰色集合,之后将此灰色对象放入到黑色集合