WebObjects:メモリ不足エラー対応
【問題】
WebObjectsで開発したWebアプリケーションが稼動中にメモリ不足でメモリ割り当てできなくなったとき,OutOfMemoryError例外が発生します。
【対応策】
WebObjectsで開発するWebアプリはJavaアプリケーションなので,対応策は基本的にJavaアプリケーションと同じです。
■割り当てメモリと残メモリの調査
Webアプリケーションには,起動時にJava VMからヒープメモリが割り当てられます。Webアプリケーションは,実メモリサイズにかかわりなく割当メモリサイズ以上のメモリを使用することはできません。そのため,まずはWebアプリケーションがJavaVMから十分なサイズのメモリを割り当てられているかを確認しておく必要があります。
割り当てられたヒープメモリのサイズは以下のコードで調べることができます。このコードはたとえばmainメソッドの先頭に埋め込むと良いでしょう。
割り当てメモリサイズを表示するJavaプログラムコード |
long total = Runtime.getRuntime().totalMemory(); System.out.println("Total Memory = " + Long.toString(total) + "bytes"); |
特定の時点での残りのヒープメモリは以下のコードで調べることができます。
このコードでは回収できるメモリはできるだけ回収してから残メモリサイズをカウントするため,事前にgcを呼ぶようにしています。
このコードはOutOfMemoryError例外が発生する処理を行う直前の残メモリを調べるときなどに使えるでしょう。
残メモリサイズを表示するJavaプログラムコード |
Runtime.getRuntime().gc(); long free = Runtime.getRuntime().freeMemory(); System.out.println("Free Memory = " + Long.toString(free) + "bytes"); |
■Javaでの割り当てメモリ拡張方法
Javaアプリケーションのメモリ不足に対する最も手っ取り早い対処方法が,アプリケーション割り当てメモリを増やすことです。
Javaでは,アプリを起動するjavaコマンド([Win版][Solaris版])へのオプション指定で割り当てメモリのサイズを指定することができます。
指定できるオプション指定:
-Xmxサイズ値:割り当てメモリの最大値を指定
-Xmsサイズ値:割り当てメモリの初期値を指定
サイズ値は,-Xmxは2MBより大きい1024の倍数,-Xmsは1MBより大きい1024の倍数でなければなりません。
各サイズ値にキロバイトを指定する場合はkまたはK,メガバイトを指定する場合はmまたはMを付けます。
-Xmxで指定できる値の上限は,OS環境やJavaVMのバージョンにより異なるようです。-Xmxに上限を超える値を指定した場合は「Could not reserve enough space for object heap」というエラーメッセージが返ります。
コマンドラインから起動する場合のオプション指定例:最大値128MB,初期値64MB,起動クラス:EntryClass |
java -Xmx128m -Xms64m EntryClass |
■WebObjectsでメモリサイズを指定するには?
オプション「-Xmxサイズ値」及び「-Xmsサイズ値」をWebObjectsで運用するWebアプリに適用するには以下のようにします。
●運用環境で,すでに実稼動しているWebアプリに設定する。
JavaMonitorで以下の設定を行います。
1.JavaMonitorを起動し,Applicationsタブの画面から設定するアプリケーションの「Config」ボタンを押します。
2.「Configuring Application "アプリケーション名"」の画面が表示され,「New Instance Defaults」が開いている状態になります。
3.「New Instance Defaults」の「Additional Arguments:」テキストボックスにオプション「-Xmxサイズ値 -Xmsサイズ値」を入力(追記)して「Push」「Update for New Instances Only」ボタンを押します。
4.アプリケーションのDetail View画面に移動し,アプリケーションを再起動します。
●開発版(動作確認用)に設定する。
1.Xcodeにて,プロジェクト名のターゲットをダブルクリックで開きます。
2.「設定」ポップアップで「Development」を選びます。
3.ウインドウの左側リストから「設定」→「シンプルビュー」→「詳細設定ビュー」を開きます。
4.「ビルド設定」が開くので,この中の「JVM_OPTIONS」に「-Xmxサイズ値 -Xmsサイズ値」を入力(追記)します。
5.ウインドウを閉じ,ターゲットをクリーニングしてビルドします。
●開発環境でビルドする運用版に設定する。
1.Xcodeにて,プロジェクト名のターゲットをダブルクリックで開きます。
2.ウインドウの左側リストから「設定」→「シンプルビュー」→「詳細設定ビュー」を開きます。
3.「ビルド設定」が開くので,この中の「JVM_OPTIONS」に「-Xmxサイズ値 -Xmsサイズ値」を入力(追記)します。
4.以上の操作をすべてのターゲットのすべての「設定」ポップアップで行います。
5.ウインドウを閉じ,ターゲットをクリーニングしてビルドします。
※上記で指定した内容が,ビルドした運用版Webアプリのパッケージに含まれる各プラットフォーム用クラスパスファイル(例:MacOS用のクラスパスファイルは「Contents/MacOS/MacOSClassPath.txt」)の「# JVMOptions」行に反映されます。
■関連情報
OutOfMemoryError対応事例(@IT:Java Solution)
WebObjects旧版のJavaメモリリーク問題
WebObjects:[API Reference(javadoc)][ADC Tools][サポート]
■関連書籍をAmazonで検索:[Java][WebObjects 和書 洋書]
●省メモリプログラミング―メモリ制限のあるシステムのためのソフトウェアパターン集
| 固定リンク
「プログラミング」カテゴリの記事
- シェルスクリプト:「.svn」ディレクトリを一括削除する(2015.03.23)
- JavaScript:excanvasを使ってWebページに画像を表示する(2012.05.07)
- C言語:TRUEとFALSEの値(2012.05.06)
- Java:CSVパーサを作る(その3) - RFC4180対応 後編(2008.06.13)
- Java:CSVパーサを作る(その2) - RFC4180対応 前編(2008.06.12)
「WebObjects」カテゴリの記事
- WebObjects:CSVレスポンスの実装(2008.03.16)
- WebObjects:メモリ不足エラー対応(2008.02.11)
- WebObjects:MySQLのためのEOModelの設定(2008.02.01)
- WebObjects:日本語の基本(2008.01.26)
- WebObjects:WOMailDeliveryで日本語メール送信(2008.01.23)
「Java」カテゴリの記事
- Java:Reader/Writerにおけるclose()メソッド呼び出しの流儀(2015.06.29)
- Java:例外が起こったときに実行されるコードとされないコード(2015.03.31)
- Java:前回作成したコードの処理速度を比較する(2015.03.15)
- Java:数値を3桁ごとのカンマ区切りの文字列にする(2015.03.02)
- Java:全角の数値文字列を数値として受け付ける(2015.01.19)
「サーバ管理」カテゴリの記事
- Mac OS X Server:ローカルユーザのドメイン詐称をチェックする(2011.05.08)
- Mac OS X Server:メールサーバにドメイン認証(SPF)を設定する(2011.04.30)
- Mac OS X Server:PostfixでOP25B対応(2008.09.28)
- Mac OS X Server:Postfixとメールクライアントの接続問題(2008.09.06)
- Mac OS X Server:Webサーバ設定の問題(2008.08.31)