Excepție de memorie insuficientă într-o aplicație gestionată care se execută pe 64 de biți .NET Framework

IMPORTANT: Acest articol este tradus cu ajutorul software-ului Microsoft de traducere automată și poate fi corectat prin intermediul tehnologiei Community Translation Framework (CTF). Microsoft oferă articole traduse automat, post-editate de comunitate și articole traduse de oameni, pentru a permite accesul la toate articolele din Baza noastră de cunoștințe în mai multe limbi. Articolele traduse automat și post-editate pot conține greșeli de vocabular, sintaxă și/sau gramatică. Microsoft nu este responsabil de inexactitățile, erorile sau daunele cauzate de traducerea greșită a conținutului sau de utilizarea acestuia de către clienți. Găsiți mai multe informații despre traducerea în colaborare la http://support.microsoft.com/gp/machine-translation-corrections/ro.

Faceți clic aici pentru a vizualiza versiunea în limba engleză a acestui articol: 3152158
Simptome
Aveți o aplicație gestionată care are drept țintă 64-bit Microsoft .NET Framework 4.6.1. Această aplicație lansează o excepție de memorie insuficientă la CLR cu anumite următorul mesaj:

OutOfMemoryException: "memorie insuficientă în intervalul de spațiu de adrese specificat să continue executarea programului."
Cauză
Această excepție de memorie insuficientă este propagate de CLR când subsistemul manager cod nu poate aloca memorie într-un interval de adrese specifice de spațiu pentru acces români. (Acestea sări români corespund metoda care apelează printre DLL-urile care se află 2 GO sau mai mare în spațiul de adrese.) Trebuie să existe spațiu în decurs de 2 Go raza de apelare metodă pentru a stoca capăt de acces pentru un apel sosit de metodă de 64 de biți. Nu există niciun mod de siguranță pentru o aplicație pentru a recupera din această eroare specifică. De aceea, starea aplicației după întâmpină această eroare este necunoscut și trebuie considerată deteriorat. Singura modalitate de a recupera este să reporniți aplicația.
Remediere
Pentru a rezolva această problemă, utilizați una dintre următoarele metode de setare:
  • Implementați o setare la nivel de computer prin adăugarea următoarea cheie de registry și valoare:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= dword:00000005

  • Implementați o setare de nivel de aplicație prin adăugarea (sau îmbinarea) secțiunea următoare în fişier de configurare aplicație:
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
Explicarea: NGenReserveForJumpStubs provoacă CLR să rezerve un procent de spațiu de adrese pentru acces români lângă fiecare imagine NGen încărcat. Vă recomandăm să utilizați o valoare de 5 sau mai mare, dacă vă confruntați cu această excepţie OutOfMemory.
Informaţii suplimentare

Pentru dezvoltatori

  • .NET Framework codifică metoda apeluri ca relativ 32-bit salturi motive de performanță. Pe un sistem de 64 de biți, apelantului şi persoană apelată poate fi în continuare divizare decât 2 GB (în spațiul de adrese). Deoarece acest lucru depășește intervalul de adrese de un offset semnate de 32 de biți, .NET va crea un capăt de acces în decurs de 2 GB de apelantului. Acest acces racord poate apoi face "lung" sări la oriunde în spațiul de adrese de 64 de biți.
  • JIT și NGen mitigations funcționează ușor diferit. Ambele rezervați spațiu de adrese suplimentare în faţă, dar punctul în cazul în care această rezervării diferă între cele două.
  • NGenReserveForJumpStubs este un procentaj de virtual NGen imagine size (percentReserveForJumpStubs).
  • Un capăt tipice salt este de 12 octeți. Pentru mai multe informații, consultați JUMP_ALLOCATE_SIZE.
  • Memoria este alocată și rezervate aproape de adrese în cazul în care s-a încărcat imaginea NGen (algoritmul exactă este EEJitManager::EnsureJumpStubReserve). Memoria se angajează atunci când este necesar să aloce un capăt de acces și atunci când nu există nici o altă spațiu de adrese potrivit.
  • Diminuarea menționate anterior nu modificați conținutul NGen imagini. Imaginile NGen au același disc amprenta atât cu și fără afluxului.
  • În prezent nu există nici o metodă bună pentru a detecta atunci când aplicația este prea aproape de limita. Ce trebuie să monitorizați pentru OutOfMemoryException pentru a determina dacă există suficient spațiu rezervate.
  • Este posibil să primiți OutOfMemoryException, chiar dacă există o mulțime de memorie neutilizate, deoarece această eroare specifică este legată de disponibilitatea de memorie în raza intervalul apelantului o adresă de 2 Go.
  • Nu ar trebui să modificaţi valoare implicită a CodeHeapReserveForJumpStubs, deoarece nu pot fi legate la problema descrisă mai sus. Nu am văzut caz în cazul în care aplicația reale ar trebui să reglați această setare ca o soluție.
  • Setarea NGenReserveForJumpStubs la o valoare semnificativ mai mare poate conduce la performanță redusă și riscul de a expune alte probleme legate de efect.

Pentru utilizatorii IT

  • Această problemă poate apărea, de asemenea, alte versiuni de .NET Framework. Cu toate acestea, soluția este în prezent este valabil numai pentru .NET Framework 4.6.1.
  • Aceasta este o problemă foarte rare, care afectează numai de lucru foarte mari care au un model de executare foarte special. Mai mult decât 99 la sută din toate de lucru vreodată veți întâmpina această problemă.
  • După aplicarea lansează o excepţie OutOfMemory, singura modalitate recomandată pentru a recupera este să reporniți aplicația.

Avertisment: acest articol a fost tradus automat

Proprietăți

ID articol: 3152158 - Ultima examinare: 05/10/2016 16:54:00 - Revizie: 2.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMtro
Feedback