我们在内存中的低 RAM 上会出现什么异常

  • 本文关键字:异常 RAM 内存 我们 c#
  • 更新时间 :
  • 英文 :


如果我正在做一个递归算法来遍历一棵树......我知道它有很多数据,巨大的。大约 20 分钟后,我收到"堆栈溢出"异常。但是StackOverFlow可能是因为代码中的其他错误,也许是因为无限循环...所以我只是想确保我在 VisualStudio 中遇到的这个 SOF 错误是因为我的递归算法耗尽了 RAM,而不是因为其他错误......当我们在递归算法中耗尽内存时,我们是否有特殊类型的错误消息或异常?

如果内存不足,则会出现内存不足异常

System.OutOfMemoryException

http://msdn.microsoft.com/en-us/library/system.outofmemoryexcetion.aspx

此外,正如@SLaks所指出的那样,由于内存不足,StackoverflowException永远不会发生。

System.OutOfMemoryException 可以在内存不足时抛出。System.StackOverflowException是你已经用递归的超复杂或没有终止大小写的东西破坏了调用堆栈。

最接近报告"低 RAM"的是 OutOfMemoryException,但这只是当无法为下一个操作分配足够的连续 RAM 时。这并不意味着主机的内存不足。

StackOverflowException可能包含它作为内部异常,但我不确定。

如果你的树很深,为什么不管理自己的堆栈而不是使用递归呢?像这样:

Stack<Node> stack = new Stack<Node>();
stack.Push(rootNode);
Node currentNode;
while( (currentNode = stack.Pop()) != null)
{
    foreach(var childNode in currentNode.Children)
    {
        stack.Push(childNode);
    }
    //process this node.
}

我自己运行了一些递归实验,在耗尽堆栈空间之前给了我大约 87000 次迭代。方法调用始终使用堆栈而不是堆。如果有一种方法可以创建基于堆的堆栈,那么您可能会得到更多。在这方面,请阅读以下文章(尽管它可能不适用于 C#!

仅使用堆区域的递归

另外,看看这个...

http://joel.inpointform.net/software-development/explanation-of-stack-heap-and-recursion-causing-stack-overflow/

编辑。回答您的问题...

通常的情况是,如果您的应用程序试图超过堆栈空间,您将获得StackOverflowException。如果您的应用程序尝试超出堆空间,您将获得内存不足异常

最新更新