.NET框架如何为OutOfMemoryException分配内存?

在C ++中,实际上可以在不分配内存的情况下通过值抛出exception,所以这种情况是有道理的。 但在.NET框架中, OutOfMemoryException是一个引用types,因此它被分配在一个堆上。 如果没有足够的内存来创build新对象,.NET框架如何为OutOfMemoryException分配内存?

它由运行时预先分配。 如果您探索任何托pipe过程的堆,您会发现该exception的一个实例。

以下是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 

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

这不是托pipe的exception,但它是ex.h中声明的C ++exception。 将C ++exception转换为clrex.cpp中的托pipeexception,其中包含专门用于引发预分配的pipe理的 OutOfMemoryException的代码,该exception最初是在appdomain.cpp中分配和构build的。

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

Tim Schmelter在对另一个答案的评论中关联的调用网站与运行时内存不足以及无法构build对象无关。