首頁  >  文章  >  後端開發  >  C# OutOfMemoryException

C# OutOfMemoryException

王林
王林原創
2024-09-03 15:21:13749瀏覽

C#中的OutOfMemoryException是.NET框架執行引擎在程式沒有足夠記憶體繼續執行時拋出的例外。顧名思義,當 CLR(即公共語言運行時)無法分配執行程式某些操作所需的足夠記憶體時,我們的程式中就會出現此異常。

此異常並不總是意味著我們沒有足夠的可用記憶體空間,但有時這意味著我們沒有足夠的程式分配所需的連續記憶體。

文法

C# 中捕獲 OutOfMemoryException 的語法如下:

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

C# 中拋出 OutOfMemoryException 的語法如下:

throw new OutOfMemoryException();

上面的語句中,'throw'是C#中用來拋出例外的關鍵字。

OutOfMemoryException 在 C# 中如何運作?

在 C# 中,當我們的程式沒有足夠的空間來繼續執行時,我們會得到 OutOfMemoryException。出現此異常的原因可能有很多。當我們總共有足夠的空間供程式執行,但該空間對於程式所需完成的分配來說並不連續時,我們也會遇到此異常。造成此異常的兩個主要原因如下:

嘗試將 StringBuilder 物件的長度增加到超出 StringBuilder 的 MaxCapacity 屬性指定的長度。

我們會收到異常「記憶體不足,無法繼續執行程式。」

  • 當我們進行賦值或呼叫需要記憶體分配的方法時,同時 CLR 無法為我們的分配提供足夠的連續內存,那麼我們將得到 OutOfMemoryException。

可能導致此異常的其他原因包括:

  • 在只有 2GB 虛擬記憶體的 32 位元系統上運行應用程序,因此 CLR 很難為應用程式所需的分配提供連續的記憶體。
  • 在使用檔案處理程序、資料庫連接、指標等非託管資源後,如果我們不處理這些資源,則會導致記憶體洩漏,從而降低應用程式的效能,並可能導致 OutOfMemoryException。
  • 處理大型資料集需要大量內存,如果 CLR 沒有足夠的連續可用空間,則會導致 OutOfMemoryException。
  • 由於字串是不可變的,因此對字串執行的操作會在記憶體中建立新字串。因此,如果我們正在處理大型字串,並且如果我們在字串上重複執行串聯操作,則可能會導致多次記憶體分配,從而降低應用程式的效能,並可能成為 OutOfMemoryException 的原因。
  • 如果我們在記憶體中固定了多個物件很長一段時間,那麼垃圾收集器就很難為這些物件提供連續的記憶體分配。

範例

以下是下面提到的範例

範例#1

範例顯示當我們嘗試將 StringBuilder 物件擴展到超出其最大容量時,程式拋出 OutOfMemoryException。

代碼:

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();
}
}
}

輸出:

C# OutOfMemoryException

範例#2

範例顯示程式在嘗試在清單中新增元素時遇到 OutOfMemoryException,其中要新增的元素數量超過了清單的容量。

代碼:

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();
}
}
}

輸出:

C# OutOfMemoryException

如何避免 C# 中的 OutOfMemoryException?

我們可以透過記住以下幾點來避免 C# 中的 OutOfMemoryException:

  • 為了在使用StringBuilder 時避免出現此異常,我們可以呼叫建構函式StringBuilder.StringBuilder(Int32, Int32) 並將MaxCapacity 屬性設定為一個足夠大的值,以便在擴展對應的StringBuilder 時提供所需的空間對象。
  • 為了避免在 32 位元系統上工作時出現此異常,我們可以透過以下步驟在 Visual Studio 中將應用程式從 32 位元系統重新編譯為 64 位元系統:
  1. 選單列 ->建置->設定管理員
  2. 按一下 Active Solution Platform 清單並選擇 64 位元平台,然後按一下關閉按鈕。

如果清單中沒有 64 位元平台,則:

  • 點選清單中的「新建」選項
  • 在「新解決方案平台」視窗中,按一下「鍵入或選擇新平台」列表,然後選擇「x64」選項。
  • 點選「確定」按鈕。
  • 為了避免在使用非託管資源時出現此異常,我們應該在完成對不再需要的非託管資源的處理後呼叫 Dispose() 方法。
  • 為了在處理大型數據集時避免出現此異常,我們應該嘗試過濾數據,然後只傳遞所需的數據進行處理。
  • 為了在處理大字串或執行大字串連接時避免出現此異常,我們可以使用StringBuilder 而不是string,因為StringBuilder 是可變的,並且當我們對其執行任何操作時不會建立字串的新實例。

結論

OutOfMemoryException 是一個運行時異常,它告訴程式設計師沒有足夠的記憶體或缺少連續記憶體來分配 C# 程式所需的記憶體。

為了避免此異常,使用者應始終採取必要的預防措施並處理此異常。

以上是C# OutOfMemoryException的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn