z3x visual type thrown studio solucion outofmemoryexception net c# .net out-of-memory

c# - visual - ¿Cómo asigna.NET Framework la memoria para OutOfMemoryException?



system.outofmemoryexception c# solution (2)

En C ++ es posible lanzar una excepción por valor sin asignar memoria en un montón, por lo que esta situación tiene sentido. Pero en .NET framework, OutOfMemoryException es un tipo de referencia, por lo tanto, se asigna en un montón. ¿Cómo .NET Framework asigna memoria para OutOfMemoryException cuando no hay suficiente memoria para crear un nuevo objeto?


Cuando se encuentra una condición de ThrowOutOfMemory de memoria dentro del tiempo de ejecución, llama a ThrowOutOfMemory . Esto llama Exception::GetOOMException , que construye el objeto en la pila y luego lo copia en una instancia global asignada estáticamente, que luego se arroja.

Sin embargo, esta no es la excepción administrada, es una excepción de C ++ declarada en ex.h Las excepciones de C ++ se convierten en excepciones administradas en clrex.cpp , que contiene código para lanzar específicamente la excepción OutOfMemoryException administrada previamente asignada, que originalmente se asignó y construyó en appdomain.cpp .

Nota: Algunos de estos archivos de origen son grandes y pueden colgar su navegador durante varios segundos mientras carga el resaltado de sintaxis.

Los sitios de llamadas que Tim Schmelter enlazó en un comentario sobre la otra respuesta no están relacionados con el tiempo de ejecución que se está quedando sin memoria y no puede construir un objeto.


Está preasignado por el tiempo de ejecución. Si explora el montón de cualquier proceso administrado, encontrará una instancia de esa excepción.

Estas son las excepciones preasignadas de una aplicación Hello World:

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