Go程序运行的时候为每个goroutine创建并管理相应的栈空间,为每个goroutine分配的栈空间不能太大,goroutine开多时会浪费大量空间,也不能太小,会导致栈溢出。
go语言选择栈的栈空间管理的方式是,一开始给一个比较小的空间,随着需要自动增长。当goroutine不需要那么大的空间时,栈空间也要自动缩小。
连续栈
go 1.3推出了连续栈(Contiguous Stacks),当栈空间不够时,直接new一个2倍大的栈空间,并将原先栈空间中的数据拷贝到新的栈空间中,而后销毁旧栈。
继续假设当前栈空间即将用尽,并且需要在for循环中执行一个比较消耗空间的函数。当该函数执行时,栈空间发生了扩容,变成原先2倍大小,函数执行完成一次后,栈空间的使用量缩小回执行前的大小,但是栈空间的使用量并没有小于栈大小的1/4,不会触发栈收缩,所以在整个for循环执行过程中,不会反复触发栈空间的收缩扩容。