Eccezione di memoria in un'applicazione gestita in esecuzione su di.NET Framework di 64 bit

IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l’obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 3152158
Sintomi
Si dispongono di un'applicazione gestita che ha come destinazione di.NET Framework di Microsoft 64 bit 4.6.1. L'applicazione genera un'eccezione di memoria da Common Language Runtime con il seguente messaggio specifico:

OutOfMemoryException: "memoria insufficiente entro l'intervallo di spazio di indirizzi specificato per continuare l'esecuzione del programma."
Cause
Questa eccezione di memoria verrà distribuita da CLR quando il sottosistema di gestione del codice Impossibile allocare memoria all'interno di un intervallo di spazio di indirizzi specifici per gli stub di salto. (Questi jump stub corrispondono al metodo che chiama tra DLL che si trovano a 2 GB o più distanti tra loro nello spazio di indirizzi.) Deve esistere spazio all'interno di un raggio di 2 GB del metodo chiamante per memorizzare lo stub di collegamento per una chiamata al metodo a 64 bit. Non è sicuro per un'applicazione per risolvere il problema specifico. Pertanto, lo stato dell'applicazione dopo che si verifica questo errore è sconosciuto e deve essere considerato danneggiato. L'unico modo per ripristinare è necessario riavviare l'applicazione.
Workaround
Per risolvere questo problema, utilizzare uno dei seguenti metodi di impostazione:
  • Implementare un'impostazione a livello di computer aggiungendo la seguente chiave del Registro di sistema e il valore:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= dword:00000005

  • Implementare un'impostazione a livello di applicazione aggiungendo (o unione) nella sezione seguente al file di configurazione dell'applicazione:
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
Spiegazione: NGenReserveForJumpStubs causa CLR di riservare una percentuale dello spazio di indirizzi per stub collegamento accanto a ogni immagine NGen caricata. Si consiglia di utilizzare un valore pari a 5 o versione successiva se si verifica questa eccezione OutOfMemory.
Informazioni

Per gli sviluppatori

  • Metodo di codifica di.NET Framework le chiamate come relativi salti di 32 bit per motivi di prestazioni. In un sistema a 64 bit, chiamante e il chiamato può essere ulteriormente distanza superiore a 2 GB (spazio di indirizzi). Poiché il valore supera l'intervallo di indirizzi di un offset con segno a 32 bit, verrà creato uno stub di spostamento all'interno di 2 GB del chiamante. Questo passaggio stub sarà quindi possibile rendere "lungo" passa a un punto qualsiasi nello spazio di indirizzi a 64 bit.
  • Le attenuazioni JIT e NGen funzionano in modo leggermente diverso. Entrambi gli elementi riservare spazio di indirizzo supplementare in anticipo, ma il punto in cui viene effettuata la prenotazione è diversa tra i due.
  • NGenReserveForJumpStubs è una percentuale di virtuale (di dimensioni immagine NGenpercentReserveForJumpStubs).
  • Uno stub salto tipico è 12 byte. Per ulteriori informazioni, vedere JUMP_ALLOCATE_SIZE.
  • La memoria viene allocata e riservata per l'indirizzo dove è stato caricato l'immagine NGen (l'algoritmo esatto è EEJitManager::EnsureJumpStubReserve). La memoria è impegnata quando è necessario allocare un salto stub e quando non è disponibile alcun altro spazio di indirizzi appropriati.
  • La riduzione dei rischi indicati in precedenza non modifica il contenuto di immagini NGen. Le immagini NGen avere il footprint del disco stesso con e senza attenuazione.
  • Non è attualmente è possibile rilevare quando l'applicazione si avvicina al limite. È necessario monitorare per l'eccezione OutOfMemoryException determinare se lo spazio riservato è sufficiente.
  • Anche se non c'è molta memoria inutilizzata, perché questo errore specifico è correlata alla disponibilità di memoria all'interno di un raggio di intervallo di indirizzi di 2 GB del chiamante, potrebbe essere visualizzato il OutOfMemoryException.
  • Non è non dovrebbe modificare il valore predefinito di CodeHeapReserveForJumpStubs, perché potrebbe non essere correlato al problema descritto in precedenza. Non abbiamo visto casi dove l'applicazione effettiva sarebbe necessario regolare questa impostazione per ovviare al problema.
  • L'impostazione di NGenReserveForJumpStubs su un valore significativamente più elevato può comportare prestazioni ridotte e il rischio di esposizione di altre problematiche meno evidenti.

Per gli utenti IT

  • Questo problema può verificarsi anche su altre versioni di.NET Framework. Tuttavia, la soluzione è attualmente applicabile solo per il.NET Framework 4.6.1.
  • Questo è un problema molto raro che interessa solo i grandi carichi di lavoro che dispongono di un modello di esecuzione molto particolari. Più del 99% di tutti i carichi di lavoro verifichi mai questo problema.
  • Dopo l'applicazione genera un'eccezione OutOfMemory, il modo migliore per il ripristino è necessario riavviare l'applicazione.

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 3152158 - Ultima revisione: 05/10/2016 16:51:00 - Revisione: 3.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMtit
Feedback