« MySQL:4.1日本語問題 | トップページ | Java:ログインパスワードを暗号化する »

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 VMは参照されなくなったメモリを自動的に回収してくれますが,参照されたままのメモリは回収してくれません。

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 和書 洋書]
省メモリプログラミング―メモリ制限のあるシステムのためのソフトウェアパターン集

にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ プログラム・プログラマへ にほんブログ村 IT技術ブログ ネットワーク・SEへ 人気ブログランキングへ ←この記事が役に立ったという方はクリックお願いします。


ioPLAZA【アイ・オー・データ直販サイト】ioPLAZA【アイ・オー・データ直販サイト】ioPLAZA【アイ・オー・データ直販サイト】ioPLAZA【アイ・オー・データ直販サイト】

|

« MySQL:4.1日本語問題 | トップページ | Java:ログインパスワードを暗号化する »

プログラミング」カテゴリの記事

WebObjects」カテゴリの記事

Java」カテゴリの記事

サーバ管理」カテゴリの記事

トラックバック


この記事へのトラックバック一覧です: WebObjects:メモリ不足エラー対応:

« MySQL:4.1日本語問題 | トップページ | Java:ログインパスワードを暗号化する »