增加堆栈大小的缺点以及堆栈提交和保留之间的差异
Disadvantages of increasing Stack Size and difference between Stack Commit and Reserve
我最近在Dinkumware C++11 <regex>
库中遇到了堆栈溢出问题,到目前为止,我已经通过将堆栈提交和堆栈保留大小加倍来解决了这个问题(我还没有遇到任何问题)。
然而,我很好奇增加堆栈大小是否有任何缺点,此外,我不完全确定堆栈提交和堆栈保留之间的区别(然而,堆栈提交比堆栈保留小得多)。
增加堆栈大小的明显结果是更多的内存使用。由于在大多数情况下,与整体内存相比,堆栈并不是很大,所以这不是一个大问题。
显然,如果有许多线程每个线程都使用大堆栈,那么这可能相当于机器中的大量可用内存,尤其是当机器一开始并没有大量内存时。
"保留"空间被分配,但在被"触摸"之前并没有实际存在——换句话说,这里没有为堆栈分配物理内存空间,只是从虚拟内存映射中取出一些空间来进行分配(因此,如果您的应用程序在32位环境中需要尽可能多的内存,因此虚拟空间紧张,那么这可能仍然是一个因素)。
"已提交"空间连接了物理内存(它仍然可以交换到磁盘,但在某个地方,物理内存必须可用)。在一个整体内存不足的系统中,这是一个更大的因素,而现在这种情况往往不太常见,因为机器有多GB的RAM可用。
使用未提交的大型保留区域的副作用是,应用程序可能会导致系统耗尽物理内存,而应用程序无法检测到这一点,因为"错误"只是通过访问内存发生的,但没有任何可用的物理内存(包括交换空间),因此应用程序将不得不被杀死[或者在Linux OOM杀手的情况下"看起来有罪"的其他应用程序]。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 为多个会话保留XPtr
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 保留对其他类的成员函数的引用
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 指针保留字符串
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 函数,该函数将在堆栈底部保留最小的出现次数
- 如何在内联程序集中调用函数时保留堆栈
- 堆栈保留大小和堆栈提交大小的增加会提高应用程序性能吗
- 如何在堆栈上为非默认构造对象保留空间
- 在visual studio C++中,有没有任何方法可以在运行时增加堆栈保留大小
- 增加堆栈保留大小不会防止堆栈溢出
- 增加堆栈大小的缺点以及堆栈提交和保留之间的差异
- 为什么堆栈帧上保留的空间比x86中需要的空间多