面试题
- 创建数组时,是分配到栈上还是堆上?创建时默认大小?
https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-stack-management/ - goroutine在什么时候会发生上下文切换
阿里一面
goroutine并不能像线程的调度那样,goroutine调度时,必须由当前正在占用CPU的goroutine主动让出CPU给新的goroutine,才能完成切换操作。
具体实现是这样的:
• go对所有的系统调用进行了封装
• 当前执行的goroutine如果正在执行系统调用或者可能会导致当前goroutine阻塞的操作时,runtime就会把当前这个goroutine切换掉。
因此一个很有意思的事情就发生了,如果当前的goroutine没有出现上述的可能会导致goroutine切换的条件时,就可以一直占用CPU(实际上只是一直占用线程),而且并不会因为这个goroutine占用时间太长而进行切换。
知道goroutine的调度策略之后,可以想到这种策略可能会带来的问题,假如有n个goroutine出现阻塞,并且n >= GOMAXPROCS时,将会导致整个程序阻塞。
go给我们提供了一个方法runtime.Gosched(),调用这个方法可以让当前的goroutine主动让出CPU,这也不失为一个弥补的好方法了。而且在对go程序性能调优的时候,我们可以根据实际情况来调整GOMAXPROCS的值,例如当有密集的IO操作时,尽量把这个值设置大一点,可以避免由于大量IO操作导致阻塞线程。 - channel 原理
https://www.yuque.com/u2278269/gq5x74/rx52w8 - 小对象GC频繁,引起的服务吞吐问题,QPS毛刺现象,go 线上性能优化,如何分析|如何优化
分析思路:
火焰图
查看多有对象+被引用的对象
go tool pprof -alloc_objects
go tool pprof -inuse_objects
查看CPU占用情况,发现GC扫描函数占大量CPU,runtime.scanobject等
go tool pprof bin/dupsdc
优化思路:减少对象分配
对象如:string、 map[key]value、 slice、Type
原数据结构体 优化数据结构 优化点
map[string]SampleStruct map[[32]byte]SampleStruct key使用值类型避免对map遍历
map[int]SampleStruct map[int]SampleStruct value使用值类型避免对map遍历
simpleSlice []float64 simpleSlice [32]float64 值类型代替对象类型
避免遍历是指,GC过程中遍历对象,