2009-10-26 8 views
5
  1. Was sind die möglichen Gründe für OutofMemory Ausnahme.OutOfMemory Ausnahme

  2. Speicherzuordnungen sollten von GC verarbeitet werden.

  3. Wie viel Speicher zugewiesen/Erhältlich in den normalen .NET/C# Anwendung

In unserer Anwendung kommt es an verschiedenen Orten wie Stream.ReadToEnd() und DataTable.WriteXml(Memory stream) Funktion.

Environment ist NET C#

+1

Erstens, zumindest erwähnen die Umgebung (falls vorhanden) Ihre Frage ist etwa. Zumindest .Net und Java haben eine OOM-Ausnahme. Zweitens, 2) das ist nicht einmal eine richtige Frage. Was fragst du? Abstimmung zum Schließen. – sleske

+0

1) Envoirmment ist .Net C# 2) warum das Ques nicht richtig ist – Buzz

+0

Nun, Frage 1) eine Frage, aber so allgemein, dass es nicht wirklich eine sinnvolle Antwort hat. 2) ist keine Frage, und 3) sollte zumindest ein Fragezeichen bekommen. Bitte versuchen Sie es mit der richtigen Interpunktion und Rechtschreibung und vor allem mit dem Kontext. – sleske

Antwort

7

Die OutOfMemory exception geschieht immer dann, wenn ein Anruf zu einem der folgenden MSIL Anweisungen

  1. versagt NEWOBJ
  2. newarr
  3. box

Was im Grunde die Operation s, die neuen Speicher im Heap zuweisen, in Ihrem Fall das Stream.ReadToEnd offenbar intern Array von Bytes zuweist, um den Stream im Speicher zu laden, wenn die Datei groß genug ist, den Prozess zu unterbrechen, wird es daher diese Ausnahme auslösen.

1
  1. Nehmen wir an, Sie haben maximal 10 MB Speicher in Ihrer App zu verwenden. Sie erstellen eine neue Liste und fügen zu ihr Objektinstanzen hinzu. Lassen Sie uns nun sagen, dass jede Objektinstanz 1MB "gewichtet". Daher werden die ersten 10 Instanzen ohne Probleme hinzugefügt, aber die elfte Instanz wird die OutOfMemoryException auslösen, da nach den ersten 10 Instanzen der gesamte zugewiesene Speicher (10 MB) verwendet wurde.

  2. Der Garbage Collector sucht nach "Garbage", Instanzen, die nicht verwendet werden - Welche CANT verwendet werden, da keine anderen Instanzen auf sie zeigen. Wenn zum Beispiel ein Instanzelement vom Typ List mit enthaltenden Instanzen vorhanden ist, erfasst der GC weder die Liste noch deren Instanzen. Behalten Sie das Hinzufügen von Instanzen zur Liste mit und ohne OutOfMEmory-Ausnahme bei.

folgende vm Argumente verwenden, wenn Sie wollen/müssen die Speicher durch Ihre Anwendung verwendet zu erhöhen: Java youAppName -Xms128m -Xmx512m

2

Entweder Sie sind mit mehr Speicher als die App auf ihr zur Verfügung stehenden . In diesem Fall müssen Sie herausfinden, wie Sie Ihre Speichernutzung effizienter gestalten können. Es kann notwendig sein, Dateien/Datenbanken zu verwenden, um Daten zu speichern, die Sie nicht sofort verwenden.

Oder Sie haben ein Speicherleck. In diesem Fall müssen Sie nach Referenzen auf den Speicher suchen, wenn Sie sie nicht mehr verwenden, damit der GC den Speicher freigeben kann.

Wenn Sie C# oder .Net verwenden, können Sie den CLR Profiler verwenden, um Ihren Speicher zu analysieren, um zu sehen, wie er verwendet wird. CLR Profiler

+0

Wie viel Speicher ist für die App verfügbar? Wie kann ich das überprüfen? – Buzz

+0

Auf 32-Bit-Windows (vor Win7) gibt es eine feste Grenze von 2 GB für den virtuellen Speicher (3 GB mit einem bestimmten Switch). 64-Bit Windows kann 8 TB (7 TB auf Itanic) unterstützen. Der tatsächliche Speicher, auf den Sie vor einem Zuweisungsfehler zugreifen können, kann variieren. –

2

Entweder hat Ihre Anwendung den verfügbaren Arbeitsspeicher belegt oder Sie haben ein Problem mit der Heapfragmentierung.

Im ersten Fall haben Sie genügend Objekte erstellt, um den gesamten Speicher zu belegen, und Sie haben immer noch einen Verweis darauf, damit der Garbage Collector sie nicht bereinigen kann.

Im zweiten Fall, Heapfragmentierung, versuchen Sie, ein Objekt zu erstellen, das größer als der größte zusammenhängende Chunk des Speichers im Heap ist. Dies ist seltener, aber in manchen Fällen passiert es auch. Der normale Heap wird während GC-Läufen kompaktiert, der große Objekt-Heap jedoch nicht.

Es gibt eine gute article auf MSDN über den großen Objekt-Heap.

Edit: Ich erinnerte mich an eine andere Möglichkeit, aus dem Speicher zu bekommen. Sie können versuchen, ein Objekt zu erstellen, das größer als 2 GB ist. Das ist die maximale Objektgröße in .NET sogar auf 64-Bit.