Heim  >  Artikel  >  Backend-Entwicklung  >  C# OutOfMemoryException

C# OutOfMemoryException

王林
王林Original
2024-09-03 15:21:13768Durchsuche

OutOfMemoryException in C# ist eine Ausnahme, die von der .NET Framework-Ausführungs-Engine ausgelöst wird, wenn das Programm nicht über genügend Speicher verfügt, um seine Ausführung fortzusetzen. Wie der Name schon sagt, tritt diese Ausnahme in unserem Programm auf, wenn die CLR, d. h. Common Language Runtime, nicht in der Lage ist, genügend Speicher zuzuweisen, der zum Ausführen bestimmter Vorgänge unseres Programms erforderlich ist.

Diese Ausnahme bedeutet nicht immer, dass wir nicht genügend Speicherplatz im Speicher haben, aber manchmal bedeutet sie, dass wir nicht genügend zusammenhängenden Speicher haben, den unser Programm für die Zuweisung benötigt.

Syntax

Die Syntax zum Abfangen einer OutOfMemoryException in C# lautet wie folgt:

try
{
//user code which can throw OutOfMemoryException
}
catch(OutOfMemoryException <em>exception</em>)
{
//statements to handle the exception
}

Die Syntax zum Auslösen einer OutOfMemoryException in C# lautet wie folgt:

throw new OutOfMemoryException();

In der obigen Anweisung ist „throw“ das Schlüsselwort, das zum Auslösen von Ausnahmen in C# verwendet wird.

Wie funktioniert OutOfMemoryException in C#?

In C# erhalten wir eine OutOfMemoryException, wenn unser Programm nicht über genügend Speicherplatz verfügt, um seine Ausführung fortzusetzen. Es kann viele Gründe für diese Ausnahme geben. Diese Ausnahme tritt auch auf, wenn wir insgesamt über genügend Speicherplatz für die Ausführung unseres Programms verfügen, dieser Speicherplatz jedoch nicht für die von unserem Programm erforderlichen Zuweisungen aneinander angrenzt. Die beiden Hauptgründe für diese Ausnahme sind folgende:

Es wird versucht, die Länge eines StringBuilder-Objekts über die durch die MaxCapacity-Eigenschaft von StringBuilder angegebene Länge hinaus zu erhöhen.

Wir erhalten die Ausnahme „Nicht genügend Speicher, um die Ausführung des Programms fortzusetzen.“

  • Wenn wir eine Zuweisung vornehmen oder eine Methode aufrufen, die eine Speicherzuweisung erfordert, und die CLR gleichzeitig nicht in der Lage ist, genügend zusammenhängenden Speicher für unsere Zuweisung bereitzustellen, erhalten wir eine OutOfMemoryException.

Zu den anderen Gründen, die diese Ausnahme verursachen können, gehören:

  • Ausführen der Anwendung auf einem 32-Bit-System, das nur über 2 GB virtuellen Speicher verfügt, weshalb es für CLR schwierig ist, zusammenhängenden Speicher für die von der Anwendung benötigten Zuweisungen bereitzustellen.
  • Wenn wir nach der Arbeit mit nicht verwalteten Ressourcen wie Dateihandlern, Datenbankverbindungen, Zeigern usw. diese Ressourcen nicht entsorgen, führt dies zu einem Speicherverlust, der wiederum die Leistung unserer Anwendung beeinträchtigt und zu einer OutOfMemoryException führen kann.
  • Das Arbeiten mit großen Datensätzen erfordert eine große Menge an Speicher und wenn CLR nicht genügend zusammenhängenden Speicherplatz dafür zur Verfügung hat, führt dies zu einer OutOfMemoryException.
  • Da Zeichenfolgen unveränderlich sind, erstellen die an Zeichenfolgen ausgeführten Operationen eine neue Zeichenfolge im Speicher. Wenn wir also mit großen Zeichenfolgen arbeiten und wiederholt Verkettungsvorgänge für die Zeichenfolge durchführen, kann dies zu mehreren Speicherzuweisungen führen, was wiederum die Leistung unserer Anwendung beeinträchtigt und eine OutOfMemoryException verursachen kann.
  • Wenn wir mehrere Objekte über einen sehr langen Zeitraum im Speicher verankert haben, wird es für den Garbage Collector schwierig, diesen Objekten eine zusammenhängende Speicherzuordnung zuzuweisen.

Beispiele

Hier sind die folgenden Beispiele aufgeführt

Beispiel #1

Beispiel zeigt die vom Programm ausgelöste OutOfMemoryException, wenn wir versuchen, das StringBuilder-Objekt über seine maximale Kapazität hinaus zu erweitern.

Code:

using System;
using System.Text;
public class Program
{
public static void Main()
{
StringBuilder stringBuilder = new StringBuilder(17, 17);
stringBuilder.Append("Welcome to the ");
try
{
stringBuilder.Insert(0, "world of C# programming", 1);
Console.WriteLine(stringBuilder.ToString());
Console.ReadLine();
}
catch (OutOfMemoryException exception)
{
Console.WriteLine(exception.Message);
Console.ReadLine();
}
}
}

Ausgabe:

C# OutOfMemoryException

Beispiel #2

Beispiel zeigt ein Programm, das beim Versuch, das Element zur Liste hinzuzufügen, auf eine OutOfMemoryException stößt, wobei die Anzahl der hinzuzufügenden Elemente größer ist als die Kapazität der Liste.

Code:

using System;
using System.Text;
using System.Collections.Generic;
namespace ConsoleApp4
{
public class Program
{
public static void Main()
{
try
{
string[] strArray = GetArray();
Console.WriteLine(strArray);
Console.ReadLine();
}
catch (OutOfMemoryException exception)
{
Console.WriteLine(exception);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
public static string[] GetArray()
{
List<string> strList = new List<string>();
for (int i = 0; i <= int.MaxValue; i++)
{
strList.Add("Hello");
}
return strList.ToArray();
}
}
}

Ausgabe:

C# OutOfMemoryException

Wie vermeide ich OutOfMemoryException in C#?

Wir können OutOfMemoryException in C# vermeiden, indem wir die folgenden Punkte beachten:

  • Um diese Ausnahme bei der Arbeit mit StringBuilder zu vermeiden, können wir den Konstruktor StringBuilder.StringBuilder(Int32, Int32) aufrufen und die MaxCapacity-Eigenschaft auf einen Wert festlegen, der groß genug ist, um die erforderliche Unterbringung bereitzustellen, wenn wir den entsprechenden StringBuilder erweitern Objekt.
  • Um diese Ausnahme beim Arbeiten auf einem 32-Bit-System zu vermeiden, können wir unsere Anwendung in Visual Studio mit den folgenden Schritten vom 32-Bit- auf das 64-Bit-System neu kompilieren:
  1. Menüleiste -> Erstellen -> Konfigurationsmanager
  2. Klicken Sie auf die Liste der aktiven Lösungsplattformen, wählen Sie die 64-Bit-Plattform aus und klicken Sie dann auf die Schaltfläche „Schließen“.
  3. Wenn die 64-Bit-Plattform nicht in der Liste verfügbar ist, dann:

    • Klicken Sie in der Liste auf die Option „Neu“
    • Klicken Sie im Fenster „Neue Lösungsplattform“ auf die Liste „Geben Sie die neue Plattform ein oder wählen Sie sie aus“ und wählen Sie dann die Option „x64“.
    • Klicken Sie auf die Schaltfläche OK.
    • Um diese Ausnahme beim Arbeiten mit nicht verwalteten Ressourcen zu vermeiden, sollten wir die Dispose()-Methode immer aufrufen, nachdem wir unsere Arbeit mit der nicht mehr benötigten nicht verwalteten Ressource abgeschlossen haben.
    • Um diese Ausnahme bei der Arbeit mit großen Datensätzen zu vermeiden, sollten wir versuchen, die Daten zu filtern und dann nur die erforderlichen Daten zur Verarbeitung weitergeben.
    • Um diese Ausnahme beim Arbeiten mit großen Strings oder bei der Verkettung großer Strings zu vermeiden, können wir StringBuilder anstelle von String verwenden, da StringBuilder veränderbar ist und keine neue Instanz des Strings erstellt, wenn wir eine Operation daran ausführen.

    Fazit

    Die OutOfMemoryException ist eine Laufzeitausnahme, die dem Programmierer mitteilt, dass nicht genügend Speicher oder ein Mangel an zusammenhängendem Speicher für die vom C#-Programm benötigten Zuweisungen vorhanden ist.

    Um diese Ausnahme zu vermeiden, sollte der Benutzer immer die erforderlichen Vorsichtsmaßnahmen treffen und diese Ausnahme behandeln.

    Das obige ist der detaillierte Inhalt vonC# OutOfMemoryException. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:C# NullReferenceExceptionNächster Artikel:C# NullReferenceException