2016-08-19 6 views
4

Manchmal ist es hilfreich, eine Anwendung in eine schlechte Situation zu bekommen, um zu sehen, wie sie reagiert. Dinge wie das Abziehen des Netzwerkkabels oder das Entfernen der Stromversorgung zeigen mir, wie belastbar meine Anwendung ist und wo ich arbeiten muss.Wie ein OutOfMemoryException in .Net zu zwingen

Zu diesem Zweck, ich versuche, was der schnellste Weg, um herauszufinden, ein OutOfMemoryException in .Net zu erzwingen. Wenn ich es in einer einfachen Konsolenanwendung mache, kann ich dieses Szenario in eine laufende Anwendung einfügen. Es gibt offensichtlich andere Dinge, die berücksichtigt werden müssen, wenn OutOfMemoryExceptions behandelt wird (z. B. Speicherfragmentierung und wie der Garbage Collector die verschiedenen Generationen zugewiesen hat), aber das ist für den Umfang dieses Experiments nicht wichtig.

aktualisieren
den Zweck, die Frage zu klären, ist es wichtig, einfach zu beachten, dass nicht genügend Arbeitsspeicher Ausnahme zu werfen ist nicht hilfreich, da ich sehen möchte, wie das Programm reagiert, wenn der Speicherdruck erhöht wird. Im Wesentlichen möchte ich den GC in einen aggressiven Sammlungsmodus stimulieren und überwachen, wie sich dies auf die Leistung auswirkt, bis der Prozess aufgrund einer Ausnahme wegen zu wenig Speicherplatz beendet wird.

+1

A [alte Frage von mir] (http://stackoverflow.com/questions/6977218/parallel-foreach-can-cause-a-out-of-memory-exception-if-working-with-a -enumera) könnte Sie interessieren. –

+0

Wie belastbar könnte eine App für einen Stromausfall sein? – Rotem

+0

http://stackoverflow.com/questions/15595061/outofmemoryexception-while-populating-memorystream-256mb-allocation-on-16-gb-sys –

Antwort

4

Ein Beispiel from MSDN ..

Das folgende Beispiel zeigt die OutOfMemoryException Ausnahme von einem Aufruf der StringBuilder.Insert geworfen (Int32, String, Int32) -Methode, wenn das Beispiel versucht, eine Zeichenfolge einzufügen, die die Länge des Objekts Eigenschaft verursachen würde seine maximale Kapazität überschreiten

using System; 
using System.Text; 

public class Example 
{ 
    public static void Main() 
    { 
     StringBuilder sb = new StringBuilder(15, 15); 
     sb.Append("Substring #1 "); 
     try { 
     sb.Insert(0, "Substring #2 ", 1); 
     } 
     catch (OutOfMemoryException e) { 
     Console.WriteLine("Out of Memory: {0}", e.Message); 
     } 
    } 
} 
// The example displays the following output: 
// Out of Memory: Insufficient memory to continue the execution of the program. 

Weiter heißt es, wie man den Fehler beheben kann.

Ersetzen Sie den Aufruf des Konstruktors StringBuilder.StringBuilder (Int32, Int32) durch einen Aufruf einer anderen StringBuilder-Konstruktorüberladung. Die maximale Kapazität Ihres StringBuilder-Objekts wird auf den Standardwert Int32.MaxValue festgelegt.

Rufen Sie den StringBuilder.StringBuilder-Konstruktor (Int32, Int32) mit einem maxCapacity-Wert auf, der groß genug ist, um alle Erweiterungen des StringBuilder-Objekts aufzunehmen.

2

Nach MSDN:

Eine OutOfMemoryException Ausnahme hat zwei wesentliche Ursachen:

  • Sie versuchen, einen Stringbuilder-Objekt über die Länge durch seine StringBuilder.MaxCapacity Eigenschaft definiert zu erweitern.

  • der Common Language Runtime kann nicht genug zusammenhängenden Speicher zuzuteilen, um erfolgreich eine Operation durchführen. Diese Ausnahmebedingung kann durch einen Eigenschaftszuweisungs- oder Methodenaufruf ausgelöst werden, der eine Speicherzuweisung von erfordert. Weitere Informationen über die Ursache der OutOfMemoryException Ausnahme siehe „Out of Memory“ bezieht sich nicht auf Physical Memory.

    Diese Art von OutOfMemoryException Ausnahme stellt ein katastrophales Versagen. Wenn Sie die Ausnahme zu behandeln, Sie sollten einen catch-Block enthalten, der die Environment.FailFast Methode ruft Ihre Anwendung zu beenden und einen Eintrag in das Systemereignisprotokoll hinzufügen, wie das folgende Beispiel der Fall ist.

Es scheint mir, den ersten mit dem String-Builder würde einfacher sein.

Dies funktioniert:

var sb = new StringBuilder(5, 5); 
sb.Insert(0, "hello", 2); 
Verwandte Themen