【问题标题】:What is the effect of running an application with "Unlimited Stack" size?运行具有“无限堆栈”大小的应用程序有什么影响?
【发布时间】:2011-02-26 23:21:39
【问题描述】:

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

【问题讨论】:

    标签: linux memory memory-management memory-leaks stack


    【解决方案1】:

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

    在经典的 Unix 方式中,堆和堆栈从内存空间的相对两侧开始并相互分配,即一个增长而另一个增长。当他们击中您时,您不会收到错误消息,您只会覆盖数据,直到发生不好的事情。

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

    编辑:只是为了补充一点关于单线程。在多线程程序中,您需要分配多个堆栈。那种从两端向中间方法的增长都搞砸了。在这种情况下,堆栈从内存空间的堆栈侧以 max-stack-size-ish 块分配。然后,当您炸毁堆栈时,您就是在践踏另一个线程的堆栈。根据您的架构,您可能可以在其中添加一些页面保护来限制这一点,但这可能是 TMI ;-)

    【讨论】:

    • 不断增长的堆栈将比它击中堆更快地击中内存映射的共享对象。在 64 位 Linux 上,在与地址空间中的库发生冲突之前,堆栈最多会增长 15 GiB。您可以使用pmap <pid> 命令进行检查。
    猜你喜欢
    • 2011-10-02
    • 2012-05-16
    • 2023-04-10
    • 2023-03-19
    • 2022-07-21
    • 2011-09-26
    • 2017-03-18
    • 2015-06-15
    • 2013-03-21
    相关资源
    最近更新 更多