ホームページ  >  記事  >  バックエンド開発  >  C# のメモリ不足例外

C# のメモリ不足例外

王林
王林オリジナル
2024-09-03 15:21:13749ブラウズ

C# の OutOfMemoryException は、プログラムの実行を継続するのに十分なメモリがない場合に、.NET Framework 実行エンジンによってスローされる例外です。その名前が示すように、この例外は、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# で例外をスローするために使用されるキーワードです。

C# で OutOfMemoryException はどのように動作しますか?

C# では、プログラムの実行を継続するための十分な領域がプログラムにない場合、OutOfMemoryException が発生します。この例外が発生する理由は数多く考えられます。この例外は、全体としてプログラムを実行するのに十分な領域があるにもかかわらず、この領域がプログラムで必要な割り当てに連続していない場合にも発生します。この例外の主な理由は次の 2 つです:

StringBuilder オブジェクトの長さを、StringBuilder の MaxCapacity プロパティで指定された長さを超えて増やそうとしています。

「プログラムの実行を続行するにはメモリが不足しています」という例外が発生します。

  • メモリ割り当てを必要とする割り当てを行っているとき、またはメモリ割り当てを必要とするメソッドを呼び出しているときに、CLR が割り当てに十分な連続メモリを提供できない場合、OutOfMemoryException が発生します。

この例外の原因となる可能性のあるその他の理由は次のとおりです。

  • 仮想メモリが 2 GB しかない 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# のメモリ不足例外

例 #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# のメモリ不足例外

C# で OutOfMemoryException を回避するには?

次の点に留意することで、C# で OutOfMemoryException を回避できます。

  • StringBuilder の操作中にこの例外を回避するには、コンストラクター StringBuilder.StringBuilder(Int32, Int32) を呼び出し、対応する StringBuilder を展開するときに必要な調整を提供するのに十分な大きさの値に MaxCapacity プロパティを設定します。オブジェクト。
  • 32 ビット システムで作業しているときにこの例外を回避するには、以下の手順で Visual Studio でアプリケーションを 32 ビット システムから 64 ビット システムに再コンパイルします。
  1. メニューバー ->ビルド ->構成マネージャー
  2. アクティブ ソリューション プラットフォームのリストをクリックし、64 ビット プラットフォームを選択して、[閉じる] ボタンをクリックします。

64 ビット プラットフォームがリストにない場合:

  • リストから「新規」オプションをクリックします
  • [新しいソリューション プラットフォーム] ウィンドウで、[新しいプラットフォームを入力または選択] リストをクリックし、[x64] オプションを選択します。
  • 「OK」ボタンをクリックします。
  • アンマネージド リソースの操作中にこの例外が発生しないようにするには、不要になったアンマネージド リソースでの作業が完了した後、常に Dispose() メソッドを呼び出す必要があります。
  • 大規模なデータセットを扱うときにこの例外を回避するには、データをフィルタリングしてから、処理に必要なデータのみを渡す必要があります。
  • 大きな文字列を扱うとき、または大きな文字列の連結を実行するときにこの例外を回避するには、文字列の代わりに StringBuilder を使用します。これは、StringBuilder は変更可能であり、文字列に対して操作を実行するときに文字列の新しいインスタンスを作成しないためです。

結論

OutOfMemoryException は、十分なメモリがないか、C# プログラムに必要な割り当てに必要な連続メモリが不足していることをプログラマに伝えるランタイム例外です。

この例外を回避するには、ユーザーは常に必要な予防措置を講じ、この例外を処理する必要があります。

以上がC# のメモリ不足例外の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。