如何使用C#程序检查堆栈内存的大小

3

我尝试了很多方法,但没有一种程序可以确定堆栈的实际限制。虽然有方法可以检测堆栈溢出,但是找到实际限制的方法还没有被发现。


在Visual Studio中,有一个“调用堆栈”窗口。如果您遇到断点,可以随时检查调用顺序。 - Holger
1个回答

0

你说得对,确实没有一个好的方法来确定这个问题。但是:如果你使用了足够多的堆栈,以至于它变得重要,那么可能已经出现了很大的问题

涉及堆栈溢出的两种常见情况:

  • 递归,通常可以用非递归循环替换,有时需要使用 Stack<T>Queue<T> 作为占位符(假设这不是无意中出现的错误无限递归 - 这是一个非常常见的错误)
  • 过大的局部变量,特别是对于非平凡负载的过度使用 stackalloc(后者通常可以用 ArrayPool<T> 租赁替换,也许在检查非平凡负载大小后)

关于后者,曾经有关于“给我一些范围,但让运行时根据大小和堆栈中剩余空间的数量决定是否使用 stackalloc 或租赁或隔离数组”的概念 API 的讨论,但是:迄今为止还没有实现。

此外,请注意使用大量的堆栈空间可能比您想象的更昂贵;尽管可能分配了大型堆栈,但这是虚拟内存,并且在第一次使用之前不一定需要实际内存;因此:计划使用大量堆栈空间可能会强制实际内存分配堆栈区域,这样就永远无法回收。

因此,总结一下:不,实际上没有一个好的方法来做到这一点,但是如果您确实想要这样做,那么您可能正在做一些错误的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接