OutOfMemoryException Class

定義

プログラムの実行を継続するためのメモリが不足している場合にスローされる例外。 The exception that is thrown when there is not enough memory to continue the execution of a program.

[System.Runtime.InteropServices.ComVisible(true)]
public class OutOfMemoryException : SystemException
継承
OutOfMemoryException
派生
属性

注釈

OutOfMemoryException例外が 2 つの主な原因。An OutOfMemoryException exception has two major causes:

  • 展開しようとして、StringBuilderオブジェクトによって定義された長さを超えてそのStringBuilder.MaxCapacityプロパティ。You are attempting to expand a StringBuilder object beyond the length defined by its StringBuilder.MaxCapacity property.

  • 共通言語ランタイムは、操作を正常に実行するための十分な連続したメモリを割り当てることができません。The common language runtime cannot allocate enough contiguous memory to successfully perform an operation. メモリの割り当てを必要とするプロパティの割り当てまたはメソッド呼び出しによってこの例外をスローすることができます。This exception can be thrown by any property assignment or method call that requires a memory allocation. 原因の詳細については、 OutOfMemoryException 、例外を参照してください「メモリ不足」は、物理メモリを参照しないします。For more information on the cause of the OutOfMemoryException exception, see "Out of Memory" Does Not Refer to Physical Memory.

    この種類のOutOfMemoryException例外は致命的なエラーを表します。This type of OutOfMemoryException exception represents a catastrophic failure. 含める必要がありますが、例外を処理するために選択した場合、catchブロックを呼び出す、Environment.FailFastメソッドをアプリを終了し、次の例のように、システム イベント ログにエントリを追加します。If you choose to handle the exception, you should include a catch block that calls the Environment.FailFast method to terminate your app and add an entry to the system event log, as the following example does.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          try {
             // Outer block to handle any unexpected exceptions.
             try {
                string s = "This";
                s = s.Insert(2, "is ");
    
                // Throw an OutOfMemoryException exception.
                throw new OutOfMemoryException();
             }
             catch (ArgumentException) {
                Console.WriteLine("ArgumentException in String.Insert");
             }
    
             // Execute program logic.
          }
          catch (OutOfMemoryException e) {
             Console.WriteLine("Terminating application unexpectedly...");
             Environment.FailFast(String.Format("Out of Memory: {0}",
                                                e.Message));
          }
       }
    }
    // The example displays the following output:
    //        Terminating application unexpectedly...
    
    Module Example
       Public Sub Main()
          Try
             ' Outer block to handle any unexpected exceptions.
             Try
                Dim s As String = "This"
                s = s.Insert(2, "is ")
    
                ' Throw an OutOfMemoryException exception.
                Throw New OutOfMemoryException()
             Catch e As ArgumentException
                Console.WriteLine("ArgumentException in String.Insert")
             End Try
             
             ' Execute program logic.
    
          Catch e As OutOfMemoryException
             Console.WriteLine("Terminating application unexpectedly...")
             Environment.FailFast(String.Format("Out of Memory: {0}",
                                                e.Message))
          End Try
       End Sub
    End Module
    ' The example displays the following output:
    '       Terminating application unexpectedly...
    

例外がスローされ、それを排除するために行える操作は、以下の条件の一部:Some of the conditions under which the exception is thrown and the actions you can take to eliminate it include the following:

呼び出している、StringBuilder.Insertメソッド。You are calling the StringBuilder.Insert method.
長さを拡張しようとして、StringBuilderオブジェクトで指定されたサイズを超えるそのStringBuilder.MaxCapacityプロパティ。You are attempting to increase the length of a StringBuilder object beyond the size specified by its StringBuilder.MaxCapacity property. 次の例を示しています、OutOfMemoryExceptionへの呼び出しによってスローされた例外、StringBuilder.Insert(Int32, String, Int32)メソッドの例では、オブジェクトの原因となる文字列を挿入しようとしました。Lengthプロパティをその最大の容量を超えます。The following example illustrates the OutOfMemoryException exception thrown by a call to the StringBuilder.Insert(Int32, String, Int32) method when the example tries to insert a string that would cause the object's Length property to exceed its maximum capacity.

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.
Imports System.Text

Module Example
   Public Sub Main()
      Dim sb As New StringBuilder(15, 15)
      sb.Append("Substring #1 ")
      Try
         sb.Insert(0, "Substring #2 ", 1)
      Catch e As OutOfMemoryException
         Console.WriteLine("Out of Memory: {0}", e.Message)
      End Try
   End Sub
End Module
' The example displays the following output:
'   Out of Memory: Insufficient memory to continue the execution of the program.

エラーに対処するには、次のいずれかの操作を行うことができます。You can do either of the following to address the error:

アプリは、32 ビット プロセスとして実行されます。Your app runs as a 32-bit process.
32 ビット プロセスでは、最大 2 GB の 32 ビット システムでユーザー モード仮想メモリと 4 GB の 64 ビット システムでユーザー モード仮想メモリを割り当てることができます。32-bit processes can allocate a maximum of 2GB of virtual user-mode memory on 32-bit systems, and 4GB of virtual user-mode memory on 64-bit systems. これは、ため、共通言語ランタイムの大規模な割り当てが必要なときに十分な連続したメモリを割り当てることが難しく、ことができます。This can make it more difficult for the common language runtime to allocate sufficient contiguous memory when a large allocation is needed. これに対し、64 ビット プロセスでは、最大 8 TB の仮想メモリを割り当てることができます。In contrast, 64-bit processes can allocate up to 8TB of virtual memory. この例外に対処するため、64 ビット プラットフォームを対象とするアプリを再コンパイルします。To address this exception, recompile your app to target a 64-bit platform. Visual Studio での特定のプラットフォームを対象とする方法の詳細については、次を参照してください。方法: 構成 Projects to Target Platformsします。For information on targeting specific platforms in Visual Studio, see How to: Configure Projects to Target Platforms.

アプリがアンマネージ リソースをリークしています。Your app is leaking unmanaged resources
(ファイル、メモリ マップト ファイルは、パイプ、レジストリ キー、および待機ハンドルへのハンドルを含む) オペレーティング システムの処理など、アンマネージ リソースに割り当てられたメモリは管理しません。 ガベージ コレクターはマネージ型に割り当てられたメモリを解放できませんが、など、Windows API の呼び出しによって直接、またはメモリ割り当て関数への呼び出しによって割り当てられたメモリ ブロックとmallocします。Although the garbage collector is able to free memory allocated to managed types, it does not manage memory allocated to unmanaged resources such as operating system handles (including handles to files, memory-mapped files, pipes, registry keys, and wait handles) and memory blocks allocated directly by Windows API calls or by calls to memory allocation functions such as malloc. アンマネージ リソースを消費する型を実装、IDisposableインターフェイス。Types that consume unmanaged resources implement the IDisposable interface.

アンマネージ リソースを使用する型を使用している場合に呼び出す必ず必要があります、IDisposable.Disposeメソッドの使用を終了するときにします。If you are consuming a type that uses unmanaged resources, you should be sure to call its IDisposable.Dispose method when you have finished using it. (一部の種類の実装も、Closeを関数と同じであるメソッド、Disposeメソッドです)。詳細については、次を参照してください。、オブジェクトを実装 IDisposable のを使用してトピック。(Some types also implement a Close method that is identical in function to a Dispose method.) For more information, see the Using Objects That Implement IDisposable topic.

アンマネージ リソースを使用する型を作成した場合は、Dispose パターンを実装している、必要に応じて、指定のファイナライザーを確認します。If you have created a type that uses unmanaged resources, make sure that you have implemented the Dispose pattern and, if necessary, supplied a finalizer. 詳細については、次を参照してください。、 Dispose パターンDispose メソッドの実装、およびObject.Finalizeトピック。For more information, see the Dispose Pattern, Implementing a Dispose Method, and Object.Finalize topics.

64 ビット プロセスで大きな配列を作成しようとしました。You are attempting to create a large array in a 64-bit process.
既定では、共通言語ランタイムにサイズが 2 GB を超えています。 1 つのオブジェクトはできません。By default, the common language runtime does not allow single objects whose size exceeds 2GB. この既定の設定を上書きするには、合計サイズが 2 GB を超える配列を有効にするのに構成ファイルの設定を使用できます。To override this default, you can use the configuration file setting to enable arrays whose total size exceeds 2 GB.

メモリでは、データ (配列、コレクション、またはデータベースのデータ セット) などの非常に大きなセットで作業しています。You are working with very large sets of data (such as arrays, collections, or database data sets) in memory.
メモリ内に存在するデータ セットまたはデータ構造が非常に大きいので、共通言語ランタイムが、連続する十分なメモリを割り当てることはできないことになったときに、OutOfMemoryException例外が発生します。When data structures or data sets that reside in memory become so large that the common language runtime is unable to allocate enough contiguous memory for them, an OutOfMemoryException exception results.

防ぐために、OutOfMemoryException例外の低いデータがメモリに常駐しているか、データをメモリ割り当てが少ないを必要とするセグメントに分割されますようにアプリケーションを変更する必要があります。To prevent the OutOfMemoryException exceptions, you must modify your application so that less data is resident in memory, or the data is divided into segments that require smaller memory allocations. 例:For example:

  • すべてのデータをデータベースから取得し、サーバーへのトリップを最小限に抑えるアプリでフィルター処理している場合をアプリに必要なデータのサブセットのみを返すクエリを変更する必要があります。If you are retrieving all of the data from a database and then filtering it in your app to minimize trips to the server, you should modify your queries to return only the subset of data that your app needs. 大規模なテーブルを操作するとき複数のクエリは、ほとんどが詳細はすべて 1 つのテーブル内のデータの取得し、それよりも効率的です。When working with large tables, multiple queries are almost always more efficient than retrieving all of the data in a single table and then manipulating it.

  • ユーザーが動的に作成したクエリを実行している場合は、クエリによって返されるレコードの数が制限されることを確認してください。If you are executing queries that users create dynamically, you should ensure that the number of records returned by the query is limited.

  • 大きな配列を使用しているかどうか、またはその他のコレクション オブジェクトのサイズ、結果、OutOfMemoryException例外をすべて一度に使用するのではなく、データをサブセットで動作するアプリケーションを変更する必要があります。If you are using large arrays or other collection objects whose size results in an OutOfMemoryException exception, you should modify your application to work the data in subsets rather than to work with it all at once.

次の例では、2億浮動小数点値で構成しの平均を計算する配列を取得します。The following example gets a array that consists of 200 million floating-point values and then calculates their mean. 例の出力で示すは、例では、平均を計算する前にメモリ内配列全体を格納するため、OutOfMemoryExceptionがスローされます。The output from the example shows that, because the example stores the entire array in memory before it calculates the mean, an OutOfMemoryException is is thrown.

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      Double[] values = GetData();
      // Compute mean.
      Console.WriteLine("Sample mean: {0}, N = {1}",
                        GetMean(values), values.Length);
   }

   private static Double[] GetData()
   {
      Random rnd = new Random();
      List<Double> values = new List<Double>();
      for (int ctr = 1; ctr <= 200000000; ctr++) {
         values.Add(rnd.NextDouble());
         if (ctr % 10000000 == 0)
            Console.WriteLine("Retrieved {0:N0} items of data.",
                              ctr);
      }
      return values.ToArray();
   }

   private static Double GetMean(Double[] values)
   {
      Double sum = 0;
      foreach (var value in values)
         sum += value;

      return sum / values.Length;
   }
}
// The example displays output like the following:
//    Retrieved 10,000,000 items of data.
//    Retrieved 20,000,000 items of data.
//    Retrieved 30,000,000 items of data.
//    Retrieved 40,000,000 items of data.
//    Retrieved 50,000,000 items of data.
//    Retrieved 60,000,000 items of data.
//    Retrieved 70,000,000 items of data.
//    Retrieved 80,000,000 items of data.
//    Retrieved 90,000,000 items of data.
//    Retrieved 100,000,000 items of data.
//    Retrieved 110,000,000 items of data.
//    Retrieved 120,000,000 items of data.
//    Retrieved 130,000,000 items of data.
//
//    Unhandled Exception: OutOfMemoryException.
Imports System.Collections.Generic

Module Example
   Public Sub Main()
      Dim values() As Double = GetData()
      ' Compute mean.
      Console.WriteLine("Sample mean: {0}, N = {1}",
                        GetMean(values), values.Length)
   End Sub
   
   Private Function GetData() As Double()
      Dim rnd As New Random()
      Dim values As New List(Of Double)()
      For ctr As Integer = 1 To 200000000
         values.Add(rnd.NextDouble)
         If ctr Mod 10000000 = 0 Then
            Console.WriteLine("Retrieved {0:N0} items of data.",
                              ctr)
         End If
      Next
      Return values.ToArray()
   End Function
   
   Private Function GetMean(values() As Double) As Double
      Dim sum As Double = 0
      For Each value In values
         sum += value
      Next
      Return sum / values.Length
   End Function
End Module
' The example displays output like the following:
'    Retrieved 10,000,000 items of data.
'    Retrieved 20,000,000 items of data.
'    Retrieved 30,000,000 items of data.
'    Retrieved 40,000,000 items of data.
'    Retrieved 50,000,000 items of data.
'    Retrieved 60,000,000 items of data.
'    Retrieved 70,000,000 items of data.
'    Retrieved 80,000,000 items of data.
'    Retrieved 90,000,000 items of data.
'    Retrieved 100,000,000 items of data.
'    Retrieved 110,000,000 items of data.
'    Retrieved 120,000,000 items of data.
'    Retrieved 130,000,000 items of data.
'
'    Unhandled Exception: OutOfMemoryException.

次の例では、排除、 OutOfMemoryException (これらの行をコメント アウト例では、さらに処理を許可するために必要な場合は、ファイルにデータをシリアル化する、メモリ内データ セット全体を格納することがなく、受信データを処理することによって例外のでここで、サイズが 1 GB より大きいファイル) を生成して呼び出し元のルーチンに計算された平均とケースの数を返します。The following example eliminates the OutOfMemoryException exception by processing the incoming data without storing the entire data set in memory, serializing the data to a file if necessary to permit further processing (these lines are commented out in the example, since in this case they produce a file whose size is greater than 1GB), and returning the calculated mean and the number of cases to the calling routine.

using System;
using System.IO;

public class Example
{
   public static void Main()
   {
      Tuple<Double, long> result = GetResult();
      Console.WriteLine("Sample mean: {0}, N = {1:N0}",
                        result.Item1, result.Item2);
   }

   private static Tuple<Double, long> GetResult()
   {
      int chunkSize = 50000000;
      int nToGet = 200000000;
      Random rnd = new Random();
      // FileStream fs = new FileStream(@".\data.bin", FileMode.Create);
      // BinaryWriter bin = new BinaryWriter(fs);
      // bin.Write((int)0);
      int n = 0;
      Double sum = 0;
      for (int outer = 0;
           outer <= ((int) Math.Ceiling(nToGet * 1.0 / chunkSize) - 1);
           outer++) {
         for (int inner = 0;
              inner <= Math.Min(nToGet - n - 1, chunkSize - 1);
              inner++) {
            Double value = rnd.NextDouble();
            sum += value;
            n++;
            // bin.Write(value);
         }
      }
      // bin.Seek(0, SeekOrigin.Begin);
      // bin.Write(n);
      // bin.Close();
      return new Tuple<Double, long>(sum/n, n);
   }
}
// The example displays output like the following:
//    Sample mean: 0.500022771458399, N = 200,000,000
Imports System.IO

Module Example
   Public Sub Main()
      Dim result As Tuple(Of Double, Long) = GetResult()
      Console.WriteLine("Sample mean: {0}, N = {1:N0}",
                        result.Item1, result.Item2)
   End Sub

   Private Function GetResult As Tuple(Of Double, Long)
      Dim chunkSize As Integer = 50000000
      Dim nToGet As Integer = 200000000
      Dim rnd As New Random()
'       Dim fs As New FileStream(".\data.bin", FileMode.Create)
'       Dim bin As New BinaryWriter(fs)
'       bin.Write(CInt(0))
      Dim n As Integer
      Dim sum As Double
      For outer As Integer = 0 To CInt(Math.Ceiling(nToGet/chunkSize) - 1)
         For inner = 0 To Math.Min(nToGet - n - 1, chunkSize - 1)
            Dim value As Double = rnd.NextDouble()
            sum += value
            n += 1
'            bin.Write(value)
         Next
      Next
'       bin.Seek(0, SeekOrigin.Begin)
'       bin.Write(n)
'       bin.Close()
      Return New Tuple(Of Double, Long)(sum/n, n)
   End Function
End Module
' The example displays output like the following:
'   Sample mean: 0.500022771458399, N = 200,000,000

大きな文字列を連結する繰り返し。You are repeatedly concatenating large strings.
文字列は変更できないために、各文字列連結操作は、新しい文字列を作成します。Because strings are immutable, each string concatenation operation creates a new string. 小さな文字列の場合、または連結操作の数が少ない場合の影響はごくわずかです。The impact for small strings, or for a small number of concatenation operations, is negligible. 大きな文字列または連結演算に非常に多くの場合は、文字列の連結は、多くのメモリの割り当てとメモリの断片化、パフォーマンスの低下を招く可能性と、場合によってOutOfMemoryException例外。But for large strings or a very large number of concatenation operations, string concatenation can lead to a large number of memory allocations and memory fragmentation, poor performance, and possibly OutOfMemoryException exceptions.

大きな文字列の連結や、多数の連結演算を実行するを使用する際、StringBuilderクラスの代わりに、Stringクラス。When concatenating large strings or performing a large number of concatenation operations, you should use the StringBuilder class instead of the String class. 文字列の操作が完了したら、変換、StringBuilderインスタンスを呼び出すことによって文字列、StringBuilder.ToStringメソッド。When you have finished manipulating the string, convert the StringBuilder instance to a string by calling the StringBuilder.ToString method.

メモリ内オブジェクトの数が多いをピン留めします。You pin a large number of objects in memory.
メモリ内オブジェクトの数が多いをピン留めを長期間と、ガベージ コレクターが連続するメモリ ブロックを割り当てる難しくことができます。Pinning a large number of objects in memory for long periods can make it difficult for the garbage collector to allocate contiguous blocks of memory. ピン留めした多数のオブジェクトをメモリに例を使用している場合、fixedステートメント (C#) または呼び出すことによって、GCHandle.Alloc(Object, GCHandleType)のハンドル型を持つメソッドGCHandleType.Pinned、アドレスには、次を行うことができます、OutOfMemoryException例外。If you've pinned a large number of objects in memory, for example by using the fixed statement in C# or by calling the GCHandle.Alloc(Object, GCHandleType) method with a handle type of GCHandleType.Pinned, you can do the following to address the OutOfMemoryException exception.

  • 各オブジェクトは、ピン留めを本当に必要かどうかを評価します。Evaluate whether each object really needs to be pinned,

  • ある各オブジェクトは固定されておらず、できるだけ早く確認してください。Ensure that each object is unpinned as soon as possible.

  • 各呼び出しことを確認、GCHandle.Alloc(Object, GCHandleType)暗証番号 (pin) のメモリへのメソッドに対応する呼び出しには、GCHandle.Freeそのメモリの固定を解除するメソッド。Make sure that each call to the GCHandle.Alloc(Object, GCHandleType) method to pin memory has a corresponding call to the GCHandle.Free method to unpin that memory.

次の Microsoft intermediate (MSIL) 命令のスロー、OutOfMemoryException例外。The following Microsoft intermediate (MSIL) instructions throw an OutOfMemoryException exception:

OutOfMemoryException HRESULT を使用してCOR_E_OUTOFMEMORY0x8007000E 値を持ちます。OutOfMemoryException uses the HRESULT COR_E_OUTOFMEMORY, which has the value 0x8007000E.

インスタンスの初期プロパティ値の一覧についてはOutOfMemoryExceptionを参照してください、OutOfMemoryExceptionコンス トラクター。For a list of initial property values for an instance of OutOfMemoryException, see the OutOfMemoryException constructors.

注意

継承された値Dataプロパティは常にnullします。The value of the inherited Data property is always null.

コンストラクター

OutOfMemoryException()

OutOfMemoryException クラスの新しいインスタンスを初期化します。 Initializes a new instance of the OutOfMemoryException class.

OutOfMemoryException(SerializationInfo, StreamingContext)

シリアル化したデータを使用して、OutOfMemoryException クラスの新しいインスタンスを初期化します。 Initializes a new instance of the OutOfMemoryException class with serialized data.

OutOfMemoryException(String)

指定したエラー メッセージを使用して、OutOfMemoryException クラスの新しいインスタンスを初期化します。 Initializes a new instance of the OutOfMemoryException class with a specified error message.

OutOfMemoryException(String, Exception)

指定したエラー メッセージおよびこの例外の原因となった内部例外への参照を使用して、OutOfMemoryException クラスの新しいインスタンスを初期化します。 Initializes a new instance of the OutOfMemoryException class with a specified error message and a reference to the inner exception that is the cause of this exception.

プロパティ

Data

例外に関する追加のユーザー定義情報を提供する、キー/値ペアのコレクションを取得します。 Gets a collection of key/value pairs that provide additional user-defined information about the exception.

(Inherited from Exception)
HelpLink

この例外に関連付けられているヘルプ ファイルへのリンクを取得または設定します。 Gets or sets a link to the help file associated with this exception.

(Inherited from Exception)
HResult

特定の例外に割り当てられているコード化数値である HRESULT を取得または設定します。 Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

(Inherited from Exception)
InnerException

現在の例外の原因となる Exception インスタンスを取得します。 Gets the Exception instance that caused the current exception.

(Inherited from Exception)
Message

現在の例外を説明するメッセージを取得します。 Gets a message that describes the current exception.

(Inherited from Exception)
Source

エラーの原因となるアプリケーションまたはオブジェクトの名前を取得または設定します。 Gets or sets the name of the application or the object that causes the error.

(Inherited from Exception)
StackTrace

呼び出し履歴で直前のフレームの文字列形式を取得します。 Gets a string representation of the immediate frames on the call stack.

(Inherited from Exception)
TargetSite

現在の例外がスローされたメソッドを取得します。 Gets the method that throws the current exception.

(Inherited from Exception)

方法

Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。 Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetBaseException()

派生クラスでオーバーライドされた場合、それ以後に発生する 1 つ以上の例外の主要な原因である Exception を返します。 When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

(Inherited from Exception)
GetHashCode()

既定のハッシュ関数として機能します。 Serves as the default hash function.

(Inherited from Object)
GetObjectData(SerializationInfo, StreamingContext)

派生クラスでオーバーライドされた場合は、その例外に関する情報を使用して SerializationInfo を設定します。 When overridden in a derived class, sets the SerializationInfo with information about the exception.

(Inherited from Exception)
GetType()

現在のインスタンスのランタイム型を取得します。 Gets the runtime type of the current instance.

(Inherited from Exception)
MemberwiseClone()

現在の Object の簡易コピーを作成します。 Creates a shallow copy of the current Object.

(Inherited from Object)
ToString()

現在の例外の文字列形式を作成して返します。 Creates and returns a string representation of the current exception.

(Inherited from Exception)

イベント

SerializeObjectState

例外がシリアル化され、例外に関するシリアル化されたデータを含む例外状態オブジェクトが作成されたときに発生します。 Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

(Inherited from Exception)

適用対象

こちらもご覧ください