linux - 运行一个大小为 "Unlimited Stack"的应用会有什么影响?

标签 linux memory memory-management memory-leaks stack

我继承了一些我需要维护的代码,这些代码有时可能不太稳定。以前的人已经无法查询为什么他们在无限堆栈集的环境中运行应用程序,我很好奇这会产生什么影响?该应用程序似乎有一些我们无法发现的不可预测的内存错误,并且在 Valgrind 下运行该应用程序不是一种选择,因为它会大大降低应用程序的速度,以至于我们无法真正运行它。因此,任何关于这可能产生的影响的想法都会受到赞赏。

最佳答案

如果这是一个单线程标准类型的程序,限制堆栈大小实际上只是一种安全预防措施。它将防止无限递归在它死之前吃掉你所有的内存。通过将限制设置为无限制,您将能够继续在堆栈上进行分配,直到它践踏堆。

在经典的 Unix 方式中,堆和栈从内存空间的相对两侧开始并向彼此分配,即一个增长而另一个向下增长。当它们命中时,您不会收到错误,您只会覆盖数据,直到出现问题为止。

通常,您不需要大堆栈,但在堆栈上分配大对象或深度递归对于某些程序来说可能是个问题,因此它们需要更大的堆栈。

编辑:只是为了补充关于单线程的观点。在多线程程序中,您需要分配多个堆栈。这种情况会扰乱从两端向中间方法的增长。在这种情况下,堆栈从内存空间的堆栈侧分配到 max-stack-size-ish block 中。然后当你吹你的堆栈时,你正在践踏另一个线程的堆栈。根据您的体系结构,您可以在其中添加一些页面保护来限制这一点,但此时可能是 TMI ;-)

关于linux - 运行一个大小为 "Unlimited Stack"的应用会有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2960410/

相关文章:

linux - Lsyncd 未创建 lsyncd.pid 文件

java - 由于 LogManager.getLogger(Logger.class.getName()); 导致 PermGen 空间增加;

c++ - c++ 中新分配的 int 的内存大小,有没有更好的不同方式来查看它?

Java - FloatBuffers 的空闲内存

linux - 如何将一串数组放入文件

linux - PostgreSQL psql 终端命令

python - 为什么 Python `Memory Error` 列表 `append()` 剩余大量 RAM

c - 尝试复制 malloc 时遇到段错误问题

c - 从 K&R 书中解释 malloc 的这种实现

linux - 如何在 Linux 中以编程方式使用 GPIO 扩展器驱动程序?