Out Of Memory Error発生への対応

事象説明

    該当のプロセスでメモリを使いすぎた場合に発生します。メモリリークや必要以上に大きなメモリ確保が原因かもしれませんが、単に設定値が不適切なことが原因のこともあります。

状況の確認方法

    APログにjava.lang.OutOfMemoryErrorのスタックトレースが出力されます。

採取資料
復旧方法

    実際にこの現象が発生してしまった場合の復旧方法について説明します。

      プロセスグループの再起動

        通常はプロセス再起動されるので特に対処する必要がないのですが、再起動回数を越えてしまうと、プロセスグループが停止状態になってしまいます。その場合はプロセスグループの起動が必要です。

予防のための対策

    メモリリークの確認

      プロファイリングなどを採取して、メモリを多く使用している箇所、またはメモリリークしていないかなどを確認してください。確認できたら、該当箇所のソースを修正してメモリ使用量を減らしたりメモリリークを改善したりしてください。

      プロセスグループの設定の、「Java VMオプション」の「スタックトレース採取時にJavaヒープの情報を採取する」がチェックされている場合は、Javaヒープ内に存在するオブジェクトのリストがAPログに出力されます。クラスごとにオブジェクトの合計サイズとオブジェクト数を集計して出力しています。オブジェクトの合計サイズが大きい順に並んでいますので、これを参照することでリークしているオブジェクトを特定できる可能性もあります。

    Javaヒープサイズの確認

      大きなメモリ確保などして、Javaの最大ヒープサイズまでメモリを使い果たしてしまった場合にjava.lang.OutOfMemoryErrorが発生する可能性があります。このような場合には、プロセスグループの「Java VMオプション」の「ヒープの最大サイズ」の設定を見直してください。
      ヒープを使い果たしてしまったかどうかは「Java VMオプション」の「その他引数」に「-verbose:gc」を指定すると、GCのタイミングでAPログに現在使用しているヒープサイズが出力されますので、その値が最大ヒープサイズに近づいているかどうかで判断できます。

    Permanent領域の確認

      JVMは、クラスやメソッドの情報をPermanent領域という領域に格納します。ロードされるクラスの総数 がかなり多い場合など、Permanent領域を使い果たしてしまった場合にはjava.lang.OutOfMemoryErrorが発生する可能性があります。このような場合には、プロセスグループの以下の「Java VMオプション」の「その他引数」に以下の設定を行うことでPermanent領域を調整できるのでこの値を見直してください。

           -XX:PermSize=<初期値> -XX:MaxPermSize=<最大値>

      Permanent領域を使い果たしてしまったかどうかは「Java VMオプション」の「その他引数」に「-verbose:gc」を指定すると、GCのタイミングでAPログに現在使用しているヒープサイズが出力されますので、その値が最大ヒープサイズに近づいているかどうかで判断できます。ヒープサイズがまだ余裕があるのにもかかわらずjava.lang.OutOfMemoryErrorが発生するような場合は、Permanent領域が不足している可能性があります。

      HP-UXの場合は、「Java VMオプション」の「その他引数」に「-Xverbosegc」を指定することで、APログに現在使用しているPermanent領域のサイズを出力することができますので、これで判断することもできます。

    仮想メモリ使用量の確認

      仮想メモリが不足している場合にもjava.lang.OutOfMemoryErrorが発生する可能性があります。AP起動中の仮想メモリサイズ(Windows), スワップサイズ(UNIX)を確認して不足しているようでしたら、増やしてください。

    カーネルパラメータの確認

      カーネルパラメータmaxdsiz(64bit版はmaxdsiz_64bit)が不足している可能性もあります。現在の使用量は簡単には確認できませんが、この値を増やして様子を見ることも試してください。

    プロセス数の設定

      予防ではありませんが、APアボートが発生した場合、該当プロセスは再起動しますが、アボートしてから再起動が完了するまでの間の呼び出しはエラーになってしまいます。そこで複数のプロセスを設定することにより、1つがアボートしても他のプロセスで処理が続行できるように設定できます。プロセスグループの「プロセス制御」の「プロセス数」の設定を見直してください。

    再起動回数の設定

      アボートした場合のプロセスの再起動回数について設定します。システムの「上限設定」の「プロセス障害時の再起動回数」の設定を見直してください。
      また、一定時間経過した場合に再起動回数をリセットさせることができます。システムの「プロセスを正常と仮定する間隔」の設定を見直してください。

その他

    応答データサイズが大きい時、その応答送信処理の延長でjava.lang.OutOfMemoryErrorとなってしまうことがあります。電文長とヒープサイズの関係も気をつけてください。


関連情報