Exception de mémoire insuffisante dans une application managée qui s'exécute sur le.NET Framework 64 bits

IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d’une traduction incorrecte du contenu ou de son utilisation par les clients.

La version anglaise de cet article est la suivante: 3152158
Symptômes
Vous avez une application managée qui cible le.NET Framework de la Microsoft de 64 bits 4.6.1. Cette application lève une exception de mémoire insuffisante dans le CLR avec le message spécifique suivant :

OutOfMemoryException: "" mémoire insuffisante"dans la plage d'adresses spécifiée d'espace pour poursuivre l'exécution du programme.
Cause
Cette exception de mémoire insuffisante est propagée par le CLR lorsque le sous-système Gestionnaire de code ne peut pas allouer de la mémoire dans une plage d'espace adresse spécifique des stubs de saut. (Ces raccourcis stubs correspondent à la méthode qui appelle entre les DLL qui se trouvent à 2 Go ou plus séparer dans l'espace d'adressage.) Il doit être l'espace dans un rayon de 2 Go de la méthode d'appel pour stocker le stub de renvoi d'un appel de méthode de 64 bits. Il n'existe aucun moyen sûr pour une application de récupérer cette erreur spécifique. Par conséquent, l'état de l'application après avoir rencontré cette erreur est inconnu et il doit être considéré comme endommagé. La seule façon de récupérer est de redémarrer l'application.
Contournement
Pour contourner ce problème, appliquez l'une des méthodes de configuration suivantes :
  • Implémentez un paramètre de l'échelle de l'ordinateur en ajoutant la clé de Registre suivante et la valeur :

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= dword:00000005

  • Implémentez un paramètre au niveau de l'application en ajoutant (ou fusion) la section suivante à votre fichier de configuration d'application :
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
Explication: NGenReserveForJumpStubs provoque le CLR afin de réserver un pourcentage de l'espace d'adressage pour les stubs de saut près de chaque image NGen chargée. Nous vous recommandons d'utiliser une valeur supérieure ou égale à 5 si vous rencontrez cette exception OutOfMemory.
Plus d'informations

Pour les développeurs

  • Le.NET Framework code méthode appels en tant que relatifs sauts de 32 bits pour des raisons de performances. Sur un système 64 bits, l'appelant et l'appelé peuvent être plus séparés à 2 Go (espace d'adressage). Car il dépasse la plage d'adresses d'un offset signé de 32 bits, .NET créera un stub de saut dans les 2 Go de l'appelant. Ce saut stub peuvent ensuite en faire le « long » accéder à n'importe où dans l'espace d'adressage de 64 bits.
  • Les atténuations de JIT et NGen fonctionnent légèrement différemment. Les deux réservent de l'espace d'adresse supplémentaires dès le départ, mais le point où cette réservation est effectuée diffère entre les deux.
  • NGenReserveForJumpStubs est un pourcentage de (taille) image NGen virtuelpercentReserveForJumpStubs).
  • Un stub de déviation standard est de 12 octets. Pour plus d'informations, reportez-vous à la section. JUMP_ALLOCATE_SIZE.
  • La mémoire est allouée et réservée proche de l'adresse où l'image NGen a été chargé (l'algorithme exact est EEJitManager::EnsureJumpStubReserve). La mémoire est validée lorsqu'il est nécessaire d'allouer un stub de saut, et quand aucun autre espace d'adressage approprié n'est disponible.
  • L'atténuation mentionnée précédemment ne modifie pas le contenu des images NGen. Les images NGen ont le même encombrement disque avec et sans atténuation.
  • Il n'existe actuellement aucun bon moyen de détecter lorsque l'application est bientôt atteindre la limite. Vous devez surveiller l'exception OutOfMemoryException déterminer si l'espace réservé est suffisant.
  • Vous pouvez recevoir l'exception OutOfMemoryException même s'il existe beaucoup de mémoire non utilisée car cette erreur est liée à la disponibilité de la mémoire dans un rayon de plage d'adressage de 2 Go de l'appelant.
  • Vous ne devez pas modifier la valeur par défaut de CodeHeapReserveForJumpStubs, car il ne peut pas être lié au problème décrit ci-dessus. Nous n'avons pas vu les cas où l'application aurait à ajuster ce paramètre comme une solution de contournement.
  • Définir NGenReserveForJumpStubs une valeur sensiblement plus élevée peut entraîner une baisse des performances et le risque d'exposition des autres problèmes subtils.

Pour les utilisateurs

  • Ce problème peut également se produire sur d'autres versions du.NET Framework. Toutefois, la solution de contournement est actuellement applicable uniquement sur le.NET Framework 4.6.1.
  • Il s'agit d'un problème très rare qui n'affecte que les charges de travail très volumineux qui ont un modèle d'exécution très particulier. Ce problème se produit jamais à plus de 99 % de toutes les charges de travail.
  • Une fois l'application lève une exception OutOfMemory, il est recommandé uniquement pour récupérer de redémarrer l'application.

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 3152158 - Dernière mise à jour : 05/10/2016 16:42:00 - Révision : 3.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMtfr
Commentaires