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

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


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

以下是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,它在堆栈上构造对象,然后将其复制到静态分配的全局实例,然后将其引发。

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

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

Tim Schmelter在关于其他答案的评论中链接的调用站点与运行时内存不足以及无法构建对象无关。

链接地址: http://www.djcxy.com/p/80219.html

上一篇: How does .NET framework allocate memory for OutOfMemoryException?

下一篇: Memory Allocation for Variable Declared in Class