web-dev-qa-db-fra.com

Comment le framework .NET alloue-t-il de la mémoire pour OutOfMemoryException?

En C++, il est en fait possible de lever une exception par valeur sans allouer de mémoire sur un tas, donc cette situation est logique. Mais dans .NET Framework OutOfMemoryException est un type de référence, il est donc alloué sur un tas. Comment .NET Framework alloue-t-il de la mémoire pour OutOfMemoryException lorsqu'il n'y a pas assez de mémoire pour créer un nouvel objet?

143
RX_DID_RX

Il est préalloué par le runtime. Si vous explorez le tas de tout processus géré, vous trouverez une instance de cette exception.

Voici les exceptions préallouées d'une application 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
163
Brian Rasmussen

Lorsqu'une condition de mémoire insuffisante est rencontrée dans le runtime, elle appelle ThrowOutOfMemory . Cela appelle Exception :: GetOOMException , qui construit l'objet sur la pile et le copie ensuite dans une instance globale allouée statiquement, qui est ensuite levée.

Ce n'est pas l'exception gérée, cependant, c'est une exception C++ déclarée dans ex.h . Les exceptions C++ sont converties en exceptions gérées dans clrex.cpp , qui contient du code pour lever spécifiquement la pré-allouée gérée OutOfMemoryException, qui était initialement alloué et construit dans appdomain.cpp .

Remarque: Certains de ces fichiers source sont volumineux et peuvent bloquer votre navigateur pendant plusieurs secondes pendant le chargement de la coloration syntaxique.

Les sites d'appels que Tim Schmelter a liés dans un commentaire sur l'autre réponse ne sont pas liés à l'exécution à court de mémoire et à l'impossibilité de construire un objet.

41
Random832