VB のたまご

作成日: 2015/12/03, 更新日: 2015/12/03


OutOfMemoryException について

概要

  •  OutOfMemoryException は、プログラムが利用できるメモリ容量を超えて、メモリ確保しようとした際に発生する例外エラーです。 メモリを大量に確保する処理(巨大データを扱う際や、インスタンス生成のしすぎ)が無いかどうか、という視点で探すと解決の糸口につながります。


スポンサーリンク


事例と対処方法

  •  以下のサンプルは、意図的に例外エラーを発生させるコードです。 実際の業務プログラムでは、このような簡単なコードではないと思いますが、例外発生させている、直接的な原因となる部分として参考になるはずです。 また、本例外エラーが発生してしまう原因となった、根本的な原因となる別の例外エラーが、さらに奥深くにいる場合があります。 (本例外エラーは間接的に影響を受けて発生してしまったもので、本当の原因となる例外エラーを食い止めることで、本例外エラーも直る場合があります。)

  •  このような組み合わせのパターンは、本例外エラーに限らず、他の例外エラー全般にも言えることですが、そんなに頻繁に出くわすものではないと思いますので、 そういう場合もあるということだけ、覚えておいていただけると解決しやすくなるのではと思います。

  •  また、記載の対処方法は、あくまでも一例です。 他の対処方法の方が、その業務プログラムにとってベストプラクティスとなる場合もありますので、検討材料の1つという程度に確認していただければと思います。

  • スポンサーリンク



  • 再帰処理
  • Me.GetData("hello")
    
    Private Sub GetData(s As String)
        Me.GetData(s & s)
    End Sub
    
    ' 例外エラー
    System.OutOfMemoryException: 種類 'System.OutOfMemoryException' の例外がスローされました。
       場所 System.String.Concat(String str0, String str1)
    
    ' 対処方法
    Private Sub GetData(s As String)
        If 100 < s.Length Then
            Exit Sub
        End If
        Me.GetData(s & s)
    End Sub
    
  •  このサンプルでは、無限に終わらない再帰処理を使っています。 よって、本来は、StackOverflowException が発生してもおかしくない実装です。 サンプルの処理では、文字列の追加を多用しすぎて(メモリを確保しすぎて)、メモリ不足になり、 先に、OutOfMemoryException が発生することになりました。


  • 無限ループ
  • Dim lst As New List(Of S1)
    While True
        lst.Add(New S1)
    End While
    
    Structure S1
        Public Property Name As String
    End Structure
    
    ' 例外エラー
    System.OutOfMemoryException: 種類 'System.OutOfMemoryException' の例外がスローされました。
       場所 System.Collections.Generic.List`1.set_Capacity(Int32 value)
       場所 System.Collections.Generic.List`1.EnsureCapacity(Int32 min)
       場所 System.Collections.Generic.List`1.Add(T item)
    
    ' 対処方法
    サンプルは無し
    
  •  前の事例と同様、無限にメモリ確保するサンプルです。 メモリを節約して使うような、データの持ち方を再考する必要があります。

  •  最後までこの記事を読んでいただき、ありがとうございました。

  • スポンサーリンク