增加堆栈大小的缺点以及堆栈提交和保留之间的差异

Disadvantages of increasing Stack Size and difference between Stack Commit and Reserve

本文关键字:堆栈 保留 之间 提交 缺点 增加      更新时间:2023-10-16

我最近在Dinkumware C++11 <regex>库中遇到了堆栈溢出问题,到目前为止,我已经通过将堆栈提交和堆栈保留大小加倍来解决了这个问题(我还没有遇到任何问题)。

然而,我很好奇增加堆栈大小是否有任何缺点,此外,我不完全确定堆栈提交和堆栈保留之间的区别(然而,堆栈提交比堆栈保留小得多)。

增加堆栈大小的明显结果是更多的内存使用。由于在大多数情况下,与整体内存相比,堆栈并不是很大,所以这不是一个大问题。

显然,如果有许多线程每个线程都使用大堆栈,那么这可能相当于机器中的大量可用内存,尤其是当机器一开始并没有大量内存时。

"保留"空间被分配,但在被"触摸"之前并没有实际存在——换句话说,这里没有为堆栈分配物理内存空间,只是从虚拟内存映射中取出一些空间来进行分配(因此,如果您的应用程序在32位环境中需要尽可能多的内存,因此虚拟空间紧张,那么这可能仍然是一个因素)。

"已提交"空间连接了物理内存(它仍然可以交换到磁盘,但在某个地方,物理内存必须可用)。在一个整体内存不足的系统中,这是一个更大的因素,而现在这种情况往往不太常见,因为机器有多GB的RAM可用。

使用未提交的大型保留区域的副作用是,应用程序可能会导致系统耗尽物理内存,而应用程序无法检测到这一点,因为"错误"只是通过访问内存发生的,但没有任何可用的物理内存(包括交换空间),因此应用程序将不得不被杀死[或者在Linux OOM杀手的情况下"看起来有罪"的其他应用程序]。