Out of Memory-Ausnahme in einer verwalteten Anwendung, die auf 64-Bit.NET Framework ausgeführt wird

Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 3152158
Problembeschreibung
Sie haben eine verwaltete Anwendung, die auf 64-Bit-Microsoft.NET Framework 4.6.1 abzielt. Diese Anwendung löst eine Ausnahme von Speicher von der CLR mit bestimmten Meldung:

OutOfMemoryException: "nicht genügend Arbeitsspeicher Adressbereich angegebenen Speicherplatz um die Ausführung des Programms fortzusetzen."
Ursache
Diese Out-of-Memory-Ausnahme wird von der CLR weitergegeben, wenn Code Manager Subsystem in einem bestimmten Adressbereich Speicherplatz für Sprung Stubs Speicher kann nicht. (Diese Stubs springen entspricht der Methode, 2 GB oder mehr voneinander im Adressraum zwischen DLLs befinden aufruft.) Speicherplatz in einem Umkreis von 2 GB der aufrufenden Methode springen Stub für 64-Bit-Methodenaufruf gespeichert sein muss. Es ist keine sichere Möglichkeit für eine Anwendung diesen bestimmten Fehler wiederherstellen. Daher der Zustand der Anwendung nach diesen Fehler trifft ist unbekannt und sollte berücksichtigt werden beschädigt. Die einzige Möglichkeit zum Wiederherstellen wird die Anwendung neu starten.
Abhilfe
Um dieses Problem zu umgehen, verwenden Sie eine der folgenden Methoden zum festlegen:
  • Implementieren einer systemweiten Einstellung folgende Registry-Schlüssel und Wert:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= Dword:00000005

  • Implementieren Sie eine Einstellung auf Anwendungsebene hinzufügen (oder) im folgenden Abschnitt der Konfigurationsdatei der Anwendung:
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
Erläuterung: NGenReserveForJumpStubs verursacht einen Prozentsatz des Adressbereichs Sprung Stubs in der Nähe jedes geladene NGen-Image reservieren. Wenn diese OutOfMemory-Ausnahme auftreten, verwenden Sie einen Wert von 5 oder höher empfohlen.
Weitere Informationen

Für Entwickler

  • .NET Framework-Methode codiert wie relative 32-Bit-Sprünge aus Leistungsgründen. Auf einem 64-Bit-System können Aufrufer und aufgerufener weiter auseinander als 2 GB (Adressraum) sein. Da dieser Bereich von 32-Bit-Offset mit Vorzeichen überschreitet, wird NET Sprung Stub innerhalb von 2 GB des Aufrufers erstellt. Dieser Sprung Stub kann dann "lang" an einer beliebigen Stelle im 64-Bit-Adressraum zu erstellen.
  • JIT und NGen Gegenmaßnahmen werden etwas anders. Beide behalten zusätzliche Adressraum vorne, aber der Punkt, wo diese Buchung, unterscheidet zwischen den beiden.
  • NGenReserveForJumpStubs ist ein Prozentsatz der virtuellen NGen-Image Größe (percentReserveForJumpStubs).
  • Ein normalen Sprung Stub ist 12 Bytes. Weitere Informationen finden Sie unter JUMP_ALLOCATE_SIZE.
  • Der Speicher belegt und reserviert in der Nähe der Adresse NGen-Image geladen wurde (genaue Algorithmus ist EEJitManager::EnsureJumpStubReserve). Der Speicher ist Commit muss ein Sprung Stub zuweisen und keine geeigneten Adressraum verfügbar ist.
  • Die zuvor erwähnte Minderung ändern nicht den Inhalt des NGen-Images. Die NGen-Images haben dieselbe Speicherplatzbedarf mit und ohne Ausgleich.
  • Derzeit ist keine gute Möglichkeit zu erkennen, wann immer die Anwendung nähern. Sie überwachen müssen OutOfMemoryException, ob reservierte Speicherplatz ausreichend ist.
  • Die OutOfMemoryException möglicherweise auch wenn viel nicht verwendeter Speicher da dieser Fehlercode Verfügbarkeit innerhalb des Aufrufers Radius Bereich 2-GB-Adresse verknüpft ist.
  • Den Standardwert von CodeHeapReserveForJumpStubs, sollte nicht geändert werden, da es nicht mit dem oben beschriebenen Problem werden kann. Wir haben nicht erlebt, die Anwendung zum Anpassen dieser Einstellung umgehen hätte.
  • NGenReserveForJumpStubs einen wesentlich höheren Wert festlegen, kann die Sicherheitsrisiken für andere wichtige Punkte zu Leistungseinbußen führen.

Für IT-Benutzer

  • Dieses Problem kann auch auf andere Versionen von.NET Framework auftreten. Die Lösung ist jedoch nur für.NET Framework 4.6.1 geltenden.
  • Dies ist ein sehr selten Problem, das nur große Arbeitslasten betrifft, die besondere Ausführungsmuster. Mehr als 99 Prozent aller Arbeitslasten wird immer dieses Problem auftreten.
  • Nachdem die Anwendung eine OutOfMemory-Ausnahme auslöst, wird nur empfohlen wiederherstellen die Anwendung neu starten.

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 3152158 – Letzte Überarbeitung: 05/10/2016 16:40:00 – Revision: 3.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMtde
Feedback