.NET 框架如何为 OutOfMemory 异常分配内存?

在 C + + 中,实际上可以通过值抛出异常,而不需要在堆上分配内存,因此这种情况是有意义的。但是在。NET 框架 OutOfMemoryException是引用类型,因此它是在堆上分配的。 当内存不足以创建新对象时,.NET 框架如何为 OutOfMemoryException分配内存?

5075 次浏览

它是由运行库预分配的。如果查看任何托管进程的堆,都会发现该异常的一个实例。

以下是 Hello World 应用程序的预分配例外:

0:003> !dumpheap -stat -type Exception
Statistics:
MT    Count    TotalSize Class Name
735f2920        1           84 System.ExecutionEngineException
735f28dc        1           84 System.StackOverflowException
735f2898        1           84 System.OutOfMemoryException
735f2744        1           84 System.Exception
735f2964        2          168 System.Threading.ThreadAbortException

当在运行时内遇到内存不足的情况时,它调用 抛出记忆。这将调用 例外: : GetOOMException,它在堆栈上构造对象,然后将其复制到静态分配的全局实例,然后抛出该实例。

但是,这不是托管异常,而是在 前情提要中声明的 C + + 异常。在 Cpp中,C + + 异常被转换为托管异常,其中包含专门抛出预先分配的 管理 OutOfMemory 异常的代码,该异常最初是在 Appdomain.cpp中分配和构造的。

注意: 其中一些源文件很大,可能会在加载语法突显时将浏览器挂起几秒钟。

Tim Schmelter 在对另一个答案的评论中链接的调用站点与运行时内存不足和无法构造对象无关。