golang八股文整理(持续搬运)

文章目录

    • 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回收开始,然后从根节点开始遍历所有对象,把遍历到的对象从白色集合放入“灰色”集合

你可能感兴趣的:(面试,学习路线,阿里巴巴,android,前端,后端)