Stackoverflow异常没有明显的原因

时间:2014-11-12 19:01:19

标签: c# .net stack-overflow

我有一个页面,我测试的东西,所以这不是非常重要的修复,但我想知道是什么导致此异常。页面很简单。我有一个名为MakeTheData的函数,它大约有38,000行添加数据点。我注意到在启动页面时我遇到了堆栈溢出异常。

你可以在这里看到它命中断点来调用该函数。然后我继续......

enter image description here

现在我得到了一个堆栈溢出异常,甚至没有碰到函数中的第一个断点。这怎么会发生?

enter image description here

2 个答案:

答案 0 :(得分:6)

MakeTheData拆分为多个部分或尝试发布版本。我认为.NET运行时正在尝试在进入函数时为38000个局部变量(DataPoint类型)分配空间,这会立即导致堆栈溢出。

更新:正如@JonSkeet所说的那样,首先要完成这些巨大的功能。如果它是由一个优化的版本修复的,我仍然很好奇。

答案 1 :(得分:0)

StackOverflowException可能由于多种原因而发生;这个错误真正告诉你的是线程耗尽了堆栈空间来存储局部变量。碰巧我们最熟悉的是那种从未解开的经典"递归调用。"

你的DataPoint是一个结构吗?它可能为每个"新DataPoint"分配一个局部变量。 line,这意味着大小将是结构大小* 38000.鉴于你不会自己拥有该线程的堆栈(ASP.NET请求管道的堆栈将位于顶部你的方法调用),你可能没有多少空间。

解决此问题的一种方法(可能是最简单的方法)是将方法调用分解为多个方法;这样,内存分配将保持较低,并避免将堆栈吹出。