如何使用c#中的程序检查堆栈存储器的大小

问题描述 投票:2回答:1

我已经尝试了很多方法,但是有方法可以找到何时发生堆栈溢出,但是没有确定堆栈实际限制的程序

c# memory stack limit stack-overflow
1个回答
0
投票

您是对的;确实没有确定这一点的好方法。但是:如果您使用了足够多的堆栈来解决问题,某些事情可能已经很错误了

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

  • 递归,通常可以用非递归循环代替,有时以Stack<T>Queue<T>作为占位符(假设它不是无缘无故的越野车无限递归,这是一个非常常见的错误)
  • 过大的本地变量,尤其是对于非平凡的有效负载过度使用stackalloc(后者通常可以用ArrayPool<T>租约替换,也许在检查了非平凡的有效负载大小之后)

关于后者,[已经围绕一个概念性API进行了讨论,以“给我某种类型的跨度,但是让运行时根据大小和大小决定是使用stackalloc还是使用租用或隔离数组。堆栈中剩余的空间量”,但:迄今为止尚未实现。

另外,请注意,使用大量堆栈空间可能比您想象的要昂贵;尽管可能会分配一个大堆栈,但这是

virtual

内存,在第一次使用之前并不一定需要actual内存;因此:计划使用大量堆栈空间会强制actual分配堆栈区域的内存,因此永远无法回收。因此,再次总结一下:不,确实没有这样做的好方法,但是

如果您愿意

,您可能做错了。
© www.soinside.com 2019 - 2024. All rights reserved.