栈溢出问题
brpc 的 bthread 默认协程栈大小是 128KB(非 pthread 模式)。
如果在一个bthread中,它执行的函数内定义了一个局部变量map,有很多个元素,map的大小超过了128KB,协程会自动申请新的栈空间吗?
这里要分清:
map
对象本身(红黑树头、size等)
在栈上,只有几十字节。map
的节点(_Rb_tree_node
)
每次insert
时都会new
一个节点,节点在 堆上分配(通过new
→ tcmalloc)。
所以,即使有很多个元素,占用的内存大部分都在 堆,不是栈。
什么时候会真的栈溢出?
大局部数组 / 大结构体
char buf[200 * 1024]; // 200KB,直接溢出 128KB 栈
深递归
递归层数太多,函数调用栈帧累加超过 128KB。函数调用链里很多大局部变量 叠加使用。
另外,协程栈不会自动扩展,如果函数局部变量太大(几百 KB 以上),就会直接 segfault。