面试题答案
一键面试栈的初始大小
在Go语言中,每个 goroutine
的栈初始大小相对较小,通常在2KB左右。这个较小的初始大小使得可以在有限的内存空间内创建大量的 goroutine
。
动态增长
- 触发增长的时机:当
goroutine
需要更多的栈空间来存放局部变量、函数调用等数据时,会触发栈的动态增长。例如,当递归调用深度增加,或者局部变量占用空间超出当前栈容量时。 - 增长方式:Go运行时系统会为
goroutine
分配一个新的、更大的栈空间,然后将原栈中的数据复制到新栈中,并更新goroutine
的栈指针指向新栈。新栈的大小通常是原栈的两倍,这种指数级增长方式可以有效减少栈空间分配和复制的频率。
动态收缩
- 触发收缩的时机:当
goroutine
的栈使用量大幅减少,例如函数返回,使得栈中有大量空闲空间时,可能会触发栈的收缩。 - 收缩方式:Go运行时系统会检测到栈空间的空闲情况,选择合适的时机,分配一个较小的栈空间,并将当前栈中仍在使用的数据复制到新栈中,同时更新
goroutine
的栈指针,从而实现栈的收缩。这有助于在内存使用上更加高效,避免长期占用过多内存。