.NET framework 如何为 OutOfMemoryException 分配内存?

How does .NET framework allocate memory for OutOfMemoryException?

在 C++ 中,实际上可以按值抛出异常而无需在堆上分配内存,因此这种情况是有道理的。但是在 .NET framework 中 OutOfMemoryException 是一个引用类型,因此它是在堆上分配的。 当没有足够的内存来创建新对象时,.NET framework 如何为 OutOfMemoryException 分配内存?

它是由运行时预分配的。如果您探索任何托管进程的堆,您将找到该异常的一个实例。

以下是 Hello World 应用程序的预分配异常:

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

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

虽然这不是托管异常,但它是在 ex.h. C++ Exceptions are converted to managed Exceptions in clrex.cpp, which contains code to specifically throw the preallocated managed OutOfMemoryException, which was originally allocated and constructed in appdomain.cpp 中声明的 C++ 异常。

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

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