linux进程主线程堆栈是如何回收的
查了下linux 3.12.6 内核代码, linux进程主线程堆栈在exec的时候会初始化成128K, 此后如果堆栈变大超过这个值,会在缺页的时候自动增长,这时候增长的上限就是ulimit设置的那个值RLIMIT_STACK, 但是如果堆栈只增长不递减, 既不经济也不合逻辑,所以我的问题是主进程的堆栈是如何递减并回收的, 有知道的聊两句:wink:注意我说的是进程的main开始的主线程堆栈, 不是pthread创建的线程, pthread线程堆栈是固定大小,不增长没什么好讨论的。 从内核代码来看, 没有代码来回收站的内存, 也就是主线程栈只管增长不会缩小, 这从mm_struct只定义了start_stack也能看出来, 内核不记录栈的大小。
所以在栈上分配的内存是会泄露的, 一旦在主线程栈的调用路径上分配并使用了大内存, 即使后续的调用路径不在使用那么大的栈内存,只要进程还活着 这块内存内核也不会回收。 简单说就是内存泄露了。
linux的缺陷太多了, 改天我整理个缺陷列表上来 Windows也一样。 回复 2# gaojl0728
linux的缺陷太多了, 改天我整理个缺陷列表上来
比较期待这个:mrgreen:
那得多蛋疼采回去回收这个内存啊
页:
[1]