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