OutOfMemoryErrorへの対応

メモリの割り当て量の不足、システムの資源不足の場合、”OutOfMemoryError”が発生し、 アプリケーションの実行に失敗することがあります。

次の内容は、Webコンテナの動作モードとして「スタンダードモード」を選択している場合の確認方法、および対処方法です。アドバンスドモードを利用している場合は[2.4.1. TPシステム(Standard/Enterprise) >OutOfMemory発生への対応]を参照してください。

状況の確認方法

${INSTANCE_ROOT}/logs/server.logおよび、${INSTANCE_ROOT}/logs/webotx_agent.logに、”OutOfMemoryError”が 記録されているかを確認します。

もしくは、運用管理コンソール(http://Webサーバ名:ポート番号/admin/)の「統計情報」 −「JavaVMの統計情報」によって、Java VMの空きメモリの情報が確認できます。ただし、メモリ不足の 状態が継続している場合には、運用管理コンソールが正しく動作できないことがあります。

Java VMのヒープメモリに空きがあるにもかかわらず、”OutOfMemoryError”となっている 場合には、Permanent領域の不足が考えられます。"java.lang.OutOfMemoryError: PermGen space"というメッセージが 出力されている場合は、Permanent領域の不足です。

対処方法
  1. メモリ割り当て量の増加

    WebOTXの動作する Java VMに割り当てているメモリ量を増やすことが考えられます。640MBの メモリを割り当てる場合には、Java VMのオプションで“-Xmx640m”のように指定します。 メモリ割り当て量の変更の詳細については、 [高度な 管理と運用サイクルガイド > 2.1.1.1. メモリ使用量の確認]を参照してください。

  2. Permanent領域の増加

    Java VMのヒープメモリに空きがあるにもかかわらず、”OutOfMemoryError”が発生している 場合には、Permanent領域を増やすことが考えられます。Permanent領域を最大128MBにする場合 には、Java VMのオプションで“-XX:MaxPermSize=128m”のように指定します。メモリ割り当て量の 変更については、 [高度な 管理と運用サイクルガイド > 2.1.1.1. メモリ使用量の確認]を参照してください。

  3. システム資源

    WebOTXの動作するシステムの資源(メモリ、スレッド、プロセス毎のスレッド)が不足している 場合には、システムの資源の見直しを行ってください。”OutOfMemoryError”の後に”unable to create new native thread”が表示されている場合には、オペレーティングシステムでスレッドを 生成することができない状態と考えられますので、システムの状態を確認してください。
    HP-UXの場合には、システムのプロセス毎のスレッド数の上限値も確認してください。HP-UX11iの 場合には、プロセス毎のスレッド数の上限値は、カーネルパラメータのmax_thread_procに あたりますので、これを変更します。変更する手順については、HP-UXのマニュアルを参照して ください。
    Red Hat Enterprise Linux AS 4.0の場合は、/proc/sys/kernel/threads-maxでシステム全体の スレッド数の最大値が設定されますので、必要であれば変更してください。変更する手順については、 OSのマニュアルを参照してください。

メモリリークについて

アプリケーションでメモリリークを起こしているために、”OutOfMemoryError”が発生している場合が あります。この場合には、WebOTXを起動している時間に応じて、空きメモリが減っていき、 Javaのガベージコレクションが動作しても、空きメモリが増えなくなってしまいます。 運用管理コンソール(http://Webサーバ名:ポート番号/)の「統計情報」−「JavaVMの統計情報」 によって、Java VMの空きメモリの情報が確認できます。通常であれば、空きメモリが少なく なったところで、Javaのガベージコレクションが動作し空きメモリが増えます。メモリリークが 発生している場合には、時間の経過ととともに空きメモリが減少していきます。

アプリケーションのメモリリークが疑われるときには、アプリケーションのコードを見直す 必要があります。メモリリークをさらに詳しく調べるには、Javaの-Xrunhprofオプションを使って プロファイル情報を採取します。-Xrunhprofオプションを使うとパフォーマンスが低下しますので、 評価環境で実施されることをお勧めします。-Xrunhprofオプションは、例えば、Java VMの次の ようなオプションになります。

-Xrunhprof:cutoff=0,heap=all,file=/tmp/java.prof

Java VMオプションを追加するには、otxadminコマンドを使用して次のコマンドを実行します。

otxadmin> create-jvm-options --user <ユーザ名> --password <パスワード> --host <ホスト名> --port <管理ポート>
          -Xrunhprof\\:cutoff=0,heap=all,file=/tmp/java.prof

オプションを追加したらドメインを停止します。

ドメインを起動後、必要な操作(APの実行など)が終わったら、ドメインを停止する 前に-Xrunhprofオプションを削除します(削除も、統合運用管理ツールやotxadminコマンドを 利用します)。

ドメインの停止により、上記のオプションであれば、/tmp/java.profにメモリ状況の プロファイル情報が出力されますので、これを解析します。解析には、HPjmeterなどが利用 できます。HPjmeterは、Hewlett-PackardのWebサイトよりダウンロードできます。

なお、プロファイルデータを取得するには、WebOTXが利用するメモリに加えて、プロファイル データ採取用のメモリが必要になります。標準の状態ではメモリ不足になる事が考えられますので 適宜増やしてください。


関連情報