【问题标题】:Where is the out of memory exception object created in .Net?.Net 中创建的内存不足异常对象在哪里?
【发布时间】:2014-05-07 22:57:27
【问题描述】:

我有一个问题。据我所知,.net 内存不足异常可以在以下 3 种情况下引发

  1. 拳击
  2. 创建数组
  3. 创建对象

通常在托管堆碎片化或没有足够空间容纳对象时引发。我的问题如果托管堆不足,那么 OutOfMemoryException 对象在哪里创建? 不是在托管堆上创建的吗? .Net 框架如何确保堆上始终有足够的空间来创建 OutOfMemoryException 对象?

请帮忙。我可能误会了什么。

【问题讨论】:

标签: c# memory-management garbage-collection


【解决方案1】:

.Net Runtime 在每个进程中为自己保留一些空间。这将有助于框架抛出像 OutOfMemory 这样的关键异常。

您可能还想阅读以下 .Net 内存管理文章

http://www.codeproject.com/Articles/483475/Memory-Limits-in-a-NET-Process

Is there a memory limit for a single .NET process

他们有很多细节和更多参考资料供您追求

【讨论】:

    【解决方案2】:

    当您的应用程序启动时,运行时会预先创建这些异常并将它们存储在静态列表中。如果需要抛出异常,则从该列表中检索并抛出异常。这发生在 OutOfMemoryExceptionStackOverflowException 以及其他一些可能会在以后创建问题的严重异常中。

    【讨论】:

      【解决方案3】:

      .NET 框架中的堆由.NET 框架本身管理,因此它为引发此类异常保留了必要的空间。例如,StackOverflow 也是如此。

      事实上,这两个异常都可能无法由客户端处理,或者当您在这种情况下应用时处理它们是危险(如果出现OutOfMemory 异常)。仍然有应用程序处理它并尝试以某种方式“保护”客户端,但不能保证结果,您只需尽力而为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 2019-07-23
        • 1970-01-01
        • 2010-10-05
        相关资源
        最近更新 更多