2010-06-02 136 views
2

我已经继承了一些我需要维护的代码,有时可能不稳定。以前的人们不再可以查询他们为什么在一个无限制的堆栈环境中运行应用程序,我很好奇这可能是什么效果?应用程序似乎有一些不可预知的内存错误,我们无法找到并在Valgrind下运行应用程序不是一种选择,因为它会减慢应用程序的运行速度,导致我们无法真正运行它。因此,对于这可能产生的影响的任何想法都会受到赞赏。以“无限堆栈”大小运行应用程序有什么影响?

回答

2

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

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

通常,您不需要大堆栈,但是在堆栈上分配大对象或进行深度递归可能会对某些程序造成影响,因此需要更大的堆栈。

编辑:只是为了增加关于单线程的观点。在多线程程序中,您需要分配多个堆栈。这种混乱将从两端向中端的方向发展。在这种情况下,堆栈将以内存空间堆栈一侧的最大堆栈大小为单位分配。然后,当你吹你的堆栈时,你正在践踏另一个线程的堆栈。取决于你的体系结构,你可能可以在那里添加一些页面保护来限制这个,但这可能是TMI在这一点;-)

+0

越来越多的堆栈将打击内存映射的共享对象比它将打到堆。在64位Linux上,该堆栈将在与地址空间中的库冲突之前以最大15吉比特增长。你可以用'pmap '命令来检查。 – 2015-06-25 09:43:20

相关问题