BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

WebLogic Server パフォーマンス チューニング ガイド

 Previous Next Contents Index PDF で侮ヲ  

Java 仮想マシン (JVM) のチューニング

Java 仮想マシン (JVM) は、マイクロプロセッサ上で Java クラス ファイルのバイト コードを実行する仮想の「実行エンジン」インスタンスです。JVM のチューニングは、WebLogic Server とアプリケーションのパフォーマンスに影響を与えます。

以下の節では、WebLogic Server 用の JVM チューニング オプションについて説明します。

JVM チューニングの関連情報へのリンクについては、関連情報: パフォーマンス ツールと情報.を参照してください。

 


JVM のチューニングの考慮事項

表 2-1 は、JVM のチューニングに関する一般的な考慮事項を示しています。

表2-1 JVM のチューニングの一般的な考慮事項

対象事項

説明

JVM のベンダおよびバージョン

WebLogic Server の動作が保証されているプロダクション JVM だけを使用すること。WebLogic Server 7.0 は、Java 1.3 準拠の JVM のみサポートする。

動作確認状況」ページは頻繁に更新されて、さまざまなプラットフォームの最新の動作確認情報が示される。

ヒープ サイズおよびガベージ コレクションのチューニング

WebLogic Server のヒープ サイズ チューニングの詳細については、JVM のヒープ サイズとガベージ コレクションを参照。

java.sun.com でのガベージ コレクションの概要については、「Tuning Garbage Collection with the 1.3.1 Java Virtual Machine」(を参照。

世代別ガベージ コレクション

世代別ガベージ コレクションを参照。

クライアント/サーバ JVM の混在

WebLogic Server では、クライアントとサーバ用に異なる JVM バージョンを使用したデプロイメントがサポートされている。詳細については、クライアント/サーバ JVM の混在のサポート ページを参照。

UNIX スレッディング モデル

UNIX には、グリーン スレッドとネイティブ スレッドという 2 つのスレッディング モデルがある。WebLogic Server で最高のパフォーマンスとスケーラビリティを得るには、ネイティブ スレッドを使用する JVM を選択する。

Solaris を使用する場合は、Sun Microsystems の Web サイトにある「Threading Models and Solaris Versions Supported」(を参照。

Just-In-Time (JIT) JVM

WebLogic Server を実行するときは、JIT コンパイラを使用する。Sun Microsystems や Symantec などから提供されるほとんどの JVM では、JIT コンパイラが使用される。

詳細については、JVM サプライヤのドキュメントを参照。

注意: Sun Microsystems の JVM 1.3.x、JIT オプションは有効ではなくなった。Java 仮想マシン (JVM) の情報を参照。

 


JVM のヒープ サイズとガベージ コレクション

ガベージ コレクションは、Java ヒープ内の使用されていない Java オブジェクトを解放する JVM のプロセスです。Java ヒープは Java プログラムのオブジェクトが存在している場所であり、ライブ オブジェクト、デッド オブジェクト、およびフリー メモリのリポジトリです。実行中のプログラムでどのポインタからもアクセスされなくなると、オブジェクトは「ガベージ (廃棄物)」と見なされ、コレクションの対象となります。

JVM ヒープ サイズによって、ガベージ コレクションを行う頻度とその時間が決定されます。ガベージ コレクションの適切な実行頻度はアプリケーションによって異なるので、ガベージ コレクションの実際の時間と頻度を解析して調整する必要があります。大きいヒープ サイズを設定した場合、ガベージ コレクション全体は低速化しますが、実行頻度が低くなります。メモリのニーズに合わせてヒープ サイズを設定した場合、ガベージ コレクション全体は高速化しますが、実行頻度が高くなります。

ヒープ サイズのチューニングの目標は、WebLogic Server で所定の時間に処理できるクライアントの数を最大限に増やしつつ、JVM によるガベージ コレクションの実行時間を最小限に抑えることです。ベンチマーク時に最高のパフォーマンスを保証するには、大きいヒープ サイズ値を設定し、ベンチマークの実行中にガベージ コレクションが実行されないようにします。

ヒープ領域が不足している場合、次の Java エラーが表示されます。

java.lang.OutOfMemoryError <<no stack trace available>>
java.lang.OutOfMemoryError <<no stack trace available>>
Exception in thread "main"

ヒープ領域値を変更するには、ヒープ サイズ値の指定を参照してください。

ヒープ領域の不足を自動的に検出して、サーバの低メモリ状態を解決するよう WebLogic Server をコンフィグレーションするには、自動的な低メモリ状態のロギングを参照してください。

世代別ガベージ コレクション

Java HotSpot JVM 1.3 では、割り当て速度と全体的なガベージ コレクションの効率を大幅に向上させる世代別コレクタが使用されます。ネイティブ ガベージ コレクションではヒープ内のすべてのアクセス可能オブジェクトが調べられますが、世代別ガベージ コレクションでは余分な作業を省くため、オブジェクトの有効期間が考慮されます。Hotspot JVM は、ほとんどのオブジェクトは有効期間が短く、コレクションを考慮する必要がないという、効率的なガベージ コレクションが行われる状態を前提として動作します。

世代別ガベージ コレクションを使用した場合、Java ヒープは Young、Old という 2 つの世代領域に分割されます。Young 世代領域は、さらに Eden と 2 つのサバイバル領域に細分化されます。Eden は、新しいオブジェクトが割り当てられる領域です。ガベージ コレクションが実行されると、Eden 内のライブ オブジェクトは隣のサバイバル領域にコピーされます。オブジェクトはヒープ サイズの最大しきい値を超過するまで、このようにサバイバル領域間でコピーされ、その後、Young 領域から Old 領域に移動されます。Young 世代領域および Old 世代領域のサイズと比率の指定については、ヒープ サイズ値の指定を参照してください。

多くのオブジェクトは、割り当てられた直後にガベージになります。このようなオブジェクトは、「初期廃棄」オブジェクトと呼ばれます。オブジェクトの有効期間が長くなるほど、ガベージ コレクションの実行回数が増え、ガベージ コレクションは低速化します。アプリケーションがオブジェクトを作成および解放する頻度によって、ヒープ サイズが影響を受け、それによってガベージ コレクションの実行頻度が決まります。したがって、可能であれば、新しいオブジェクトを作成するよりも、オブジェクトをキャッシュして再利用するようにしてください。

オブジェクトの大半の有効期間が短いことを理解すれば、ガベージ コレクションを効率化できるようチューニングできます。世代単位でメモリ管理を行う場合、複数のメモリ プールを作成して世代の異なるオブジェクトを保持します。ガベージ コレクションは世代ごとにプールがいっぱいになると実行されます。オブジェクトの大半の有効期間を 1 回のコレクションより短くすると、ガベージ コレクションを効率化できます。世代のサイズが小さいと、ガベージ コレクションの実行頻度が増加し、それによってパフォーマンスが低下します。

世代別ガベージ コレクションのチューニングの概要については、「Tuning Garbage Collection with the 1.3.1 Java Virtual Machine」(を参照してください。

verbose ガベージ コレクションを使用したヒープ サイズの決定

verbose ガベージ コレクション (verbosegc) を使用すると、ガベージ コレクションに費やされる時間とリソースを正確に測定できます。最も効率的なヒープ サイズを判断するには、診断を目的として verbose ガベージ コレクションを有効にし、出力をログ ファイルにリダイレクトします。

次に、この手順を簡単に示します。

  1. アプリケーション実行中に、最大の負荷をかけた状態で WebLogic Server のパフォーマンスをモニタします。

  2. -verbosegc オプションを使用して JVM の verbose ガベージ コレクション出力を有効にし、標準エラーおよび標準出力の両方をログ ファイルにリダイレクトします。

    リダイレクトすることにより、スレッド ダンプ情報が WebLogic Server の情報メッセージとエラー メッセージに関連してログに記録されるので、診断する際にログ ファイルがさらに役立ちます。

    たとえば、Windows および Solaris では次のように入力します。

    % java -ms32m -mx200m -verbosegc -classpath $CLASSPATH
    -Dweblogic.Name=%SERVER_NAME% -Dbea.home="C:¥bea"
    -Dweblogic.management.username=%WLS_USER%
    -Dweblogic.management.password=%WLS_PW%
    -Dweblogic.management.server=%ADMIN_URL%
    -Dweblogic.ProductionModeEnabled=%STARTMODE%
    -Djava.security.policy="%WL_HOME%¥server¥lib¥weblogic.policy" weblogic.Server
    >> logfile.txt 2>&1

    logfile.txt 2>&1 コマンドは、標準エラーと標準出力の両方をログ ファイルにリダイレクトします。

    HPUX では、次のオプションを使用して stderr stdout を 1 つのファイルにリダイレクトします。

    -Xverbosegc:file=/tmp/gc$$.out

    $$ は、Java プロセスのプロセス ID (PID) にマップされます。出力にはガベージ コレクションの実行時間を示すタイムスタンプが含まれているので、ガベージ コレクションの実行頻度を推測できます。

  3. 以下のデータ ポイントを解析します。

    1. ガベージ コレクションの実行頻度。weblogic.log ファイルで、ガベージ コレクション前後のタイム スタンプを比較します。

    2. ガベージ コレクションの実行時間。ガベージ コレクション全体の実行時間は 3 〜 5 秒を上回ってはいけません。

    3. 平均メモリ占有量。つまり、各ガベージ コレクション実行後のヒープの状態です。ヒープの空きが常に 85% になる場合、ヒープ サイズを小さくしてもかまいません。

  4. Java HotSpot JVM 1.3 を使用している場合は、New 世代のヒープ サイズを設定します。

    ヒープ サイズ値の指定および表2-2を参照してください。

  5. ヒープ サイズがシステムの使用可能な空き RAM より大きくならないようにします。

    ページがディスクに「スワップ」されない範囲で、できるだけ大きいヒープ サイズを設定します。システムの空き RAM の容量は、ハードウェアのコンフィグレーションと、そのマシン上で実行されているプロセスのメモリ要件によって異なります。システムの空き RAM の容量の決定については、システム管理者に問い合わせてください。

  6. システムがガベージ コレクションに費やす時間が長すぎる場合 (割り当てられた「仮想」メモリを RAM が処理できない場合)、ヒープ サイズを小さくします。

    通常、使用可能な RAM (オペレーティング システムまたはその他のプロセスによって占有されない RAM) の 80% を JVM に割り当てます。

  7. 使用可能な空き RAM が大量に残っている場合は、そのマシンでより多くの WebLogic Server インスタンスを実行します。

    もう一度確認しますが、ヒープ サイズのチューニングの目標は、WebLogic Server で所定の時間に処理できるクライアントの数を最大限に増やしつつ、JVM によるガベージ コレクションの実行時間を最小限に抑えることです。

 


ヒープ サイズ値の指定

Java ヒープ サイズの値は、WebLogic Server を起動するたびに指定する必要があります。ヒープ サイズ値は、Java コマンドラインから指定するか、WebLogic Server 起動用に WebLogic 配布キットに付属しているサンプル起動スクリプトのデフォルト値を変更して指定します。

たとえば、Java コマンドラインから WebLogic Server を起動する場合、ヒープ サイズ値は次のように指定できます。

$ java -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8  -Xms512m -Xmx512m
-Dweblogic.Name=%SERVER_NAME% -Dbea.home="C:¥bea"
-Dweblogic.management.username=%WLS_USER%
-Dweblogic.management.password=%WLS_PW%
-Dweblogic.management.server=%ADMIN_URL%
-Dweblogic.ProductionModeEnabled=%STARTMODE%
-Djava.security.policy="%WL_HOME%¥server¥lib¥weblogic.policy"
weblogic.Server

これらの値のデフォルト サイズはバイト単位で指定されます。KB (キロバイト) を示すには、値に「k」または「K」を付加します。同様に、MB (メガバイト) を示すには「m」または「M」を、GB (ギガバイト) を示すには「g」または「G」を付加します。ヒープ サイズ オプションの詳細については、Java ヒープ サイズのオプションを参照してください。

WebLogic 起動スクリプトを使用したヒープ サイズの設定

WebLogic Server 配布キットには、サーバを起動するサンプル起動スクリプト、およびサーバを構築したり実行したりするための環境を設定するサンプル起動スクリプトが付属しています。

これらのスクリプトは、WL_HOME¥server¥bin にあります (WL_HOME は WebLogic Server のインストール位置)。これらの起動スクリプトは、Java に渡されるデフォルト メモリ引数 (つまり、ヒープ サイズ) や JDK の位置などの環境変数を設定し、その後に WebLogic Server の引数を使用して JVM を起動します。

WebLogic Server 起動スクリプトでは、デフォルト ヒープ サイズのパラメータが指定されます。したがって、実際の環境やアプリケーションに合わせてそれらのパラメータを変更する必要があります。「スクリプトを使用した管理サーバの起動」(を参照してください。

Java ヒープ サイズのオプション

最高のパフォーマンスは、各アプリケーションを個別にチューニングすることで実現されます。ただし、WebLogic Server の起動時に表 2-2 の JVM ヒープ サイズ オプションをコンフィグレーションすると、ほとんどのアプリケーションでパフォーマンスを向上させることができます。

これらのオプションは、使用するアーキテクチャおよびオペレーティング システムによって異なります。プラットフォーム別の JVM チューニング オプションについては、ベンダのマニュアルを参照してください。

表2-2 Java ヒープ サイズのオプション

タスク

オプション

説明

New 世代領域のヒープ サイズを設定する。

-XX:NewSize

このオプションを使用すると、New 世代領域の Java ヒープ サイズを設定できる。この値は、1MB より大きい 1024 の倍数に設定する。一般に -XX:NewSize は、最大ヒープ サイズの 4 分の 1 のサイズになるように設定する。有効期間の短いオブジェクトが多い場合ほど、このオプションの値を大きくする。

プロセッサ数が増加するほど、New 世代領域を大きく設定する必要がある。メモリの割り当ては並列処理できるが、ガベージ コレクションは並列処理されない。

New 世代領域の最大ヒープ サイズを設定する。

-XX:MaxNewSize

このオプションを使用すると、New 世代領域の最大 Java ヒープ サイズを設定できる。この値は、1MB より大きい 1024 の倍数に設定する。

New 世代領域のヒープ サイズ比率を設定する。

-XX:SurvivorRatio

New 世代領域は、3 つのサブ領域、つまり Eden と、同じサイズの 2 つのサバイバル領域に分割される。

-XX:SurvivorRatio=X オプションを使用すると、Eden とサバイバル領域のサイズ比率をコンフィグレーションできる。この値は 8 に設定し、その後、ガベージ コレクションをモニタするようにする。

最小ヒープ サイズを設定する。

-Xms

このオプションを使用すると、メモリ割り当てプールの最小サイズを設定できる。この値は、1MB より大きい 1024 の倍数に設定する。一般に、最小ヒープ サイズ (-Xms) は最大ヒープ サイズ (-Xmx) と同じ大きさに設定して、ガベージ コレクションを最小限に抑える。

最大ヒープ サイズを設定する。

-Xmx

このオプションを使用すると、最大 Java ヒープ サイズを設定できる。この値は、1MB より大きい 1024 の倍数に設定する。

 


自動的な低メモリ状態のロギング

WebLogic Server では、サーバが観測した低メモリ状態を自動的にロギングできます。WebLogic Server では、ある特定の時間間隔で設定された回数だけ利用可能な空きメモリをサンプリングして低メモリが検出されます。各間隔の最後に、空きメモリの平均が記録され、それが次の間隔で得られた平均と比較されます。サンプル間隔の後に、ユーザがコンフィグレーションした量だけ平均が落ち込んだ場合、サーバは低メモリの警告メッセージをログ ファイルに記録し、サーバの状態を「警告」に設定します。

平均空きメモリが、サーバの起動直後に記録された初期空きメモリの 5% を下回ると、WebLogic Server はメッセージをログ ファイルに記録します。

低メモリ検出プロセスの各側面は、次のように Administration Console を使用してコンフィグレーションします。

  1. 管理サーバが起動していない場合は、起動します。

  2. ドメインの Administration Console にアクセスします。

  3. ナビゲーション ツリーの [サーバ] ノードをクリックして、ドメインでコンフィグレーションされたサーバを表示します。

  4. コンフィグレーションするサーバ インスタンスの名前をクリックします。低メモリの検出は、サーバごとにコンフィグレーションします。

  5. 右ペインの [コンフィグレーション|メモリ] タブを選択します。

  6. 次の属性を必要に応じて変更し、選択したサーバ インスタンスに対する低メモリの検出をチューニングします。

  7. [適用] をクリックして変更を反映させます。

  8. サーバを再起動して、低メモリ検出の新しい属性を使用します。

 


ガベージ コレクションの手動リクエスト

サーバでガベージ コレクションを強制する前に、完全なガベージ コレクションが必要であることを確認してください。ガベージ コレクションを実行すると、JVM ではヒープ内のすべてのライブ オブジェクトを頻繁に調べます。

Administration Console を使用して、指定したサーバ インスタンスでガベージ コレクションを要求するには、次の手順に従います。

  1. Administration Console のナビゲーション ツリーで、メモリ使用状況を表示させるサーバのサーバ インスタンス ノードをクリックします。右ペインのダイアログ ボックスに、このインスタンスと関連付けられているタブが表示されます。

  2. [モニタ|パフォーマンス] タブを選択します。

  3. [メモリ使用状況] グラフで使用率が高くなっているかどうかを確認します。[メモリ使用状況] グラフには、実行中のサーバの情報のみが表示されます。

  4. [ガベージコレクションを強制する] ボタンをクリックして、ガベージ コレクションを要求します。 [ガベージコレクションを強制する] ボタンにより、JVM の System.gc() メソッドが呼び出され、ガベージ コレクションが実行されます。 ただし、このリクエストが実際にガベージ コレクションをトリガするかどうかは、JVM の実装そのもので決定されます。

 


Java HotSpot VM オプションの設定

標準の java コマンドライン オプションを使用すると、JVM のパフォーマンスを向上させることができます。これらのオプションの使い方は、使用するアプリケーションのコーディングによって異なります。コマンドライン オプションはプラットフォーム間で一貫性がありますが、プラットフォームによってはデフォルトが異なる場合もあります。

クライアント JVM とサーバ JVM の両方をテストすると、特定のアプリケーションに対してよりパフォーマンスの優れたオプションを調べることができます。Sun Microsystems の「Java HotSpot VM Options」には、Java HotSpot 仮想マシンのパフォーマンス特性に影響を与えるコマンドライン オプションと環境変数に関する情報が記述されています。

パフォーマンスを向上させる、これ以外の VM オプションについては、非標準の Java オプション (Windows および UNIX 用)を参照してください。

標準の Java オプション (Windows および UNIX 用)

Windows では、WebLogic Server は java コマンドを通じ、表 2-3 のオプションのいずれかを指定して特定バージョンの JVM を起動します。

表2-3 Windows 上の HotSpot VM 用の標準オプション

オプション

説明

-hotspot

HotSpot クライアント VM を選択する。HotSpot クライアント VM では、Sun Microsystems によれば、クラシック VM よりも優れたパフォーマンスが提供される。

-classic

クラシック VM を選択する。クラシック VM は、本質的には Java 2 SDK のバージョン 1.2 と同じ仮想マシンの実装である。

注意: Java 2 クラシック VM は、Java 2 SDK にのみ含まれる。Java 2 Runtime Environment には含まれていない。-classic オプションは、Java 2 Runtime Environment では機能しない。

UNIX では、WebLogic Server は java コマンドを通じ、表 2-4 のオプションのいずれかを指定して特定バージョンの JVM を起動します。

表2-4 UNIX 上の HotSpot VM 用の標準オプション

オプション

説明

-client または -hotspot

HotSpot クライアント VM を選択する。

-server

HotSpot サーバ VM を選択する。

Sun Microsystems の「The Java HotSpot Client and Server Virtual Machines」では、J2SE 1.3 で利用可能な Java 仮想マシンの 2 つの実装が説明されています。

非標準の Java オプション (Windows および UNIX 用)

非標準の Java オプションを使用しても、パフォーマンスを向上させることができます。これらのオプションの使い方は、使用するアプリケーションのコーディングによって異なります。コマンドライン オプションはプラットフォーム間で一貫性がありますが、プラットフォームによってはデフォルトが異なる場合もあります。非標準のコマンドライン オプションは、将来のリリースにおいて変更される可能性があります。

表 2-5 に、Windows 上の HotSpot VM でパフォーマンスを向上させる非標準オプションの例を 2 つ示します。

表2-5 Windows 上の HotSpot VM 用の非標準オプション

オプション

説明

-Xnoclassgc

このオプションは、指定されたクラスのガベージ コレクションを無効にして、そのクラスへのすべての参照が失われた後にそのクラスが参照されたときに、そのクラスの再ロードを防ぐ。このオプションでは、ヒープ サイズを大きくする必要がある。

-Xrs

JVM によるオペレーティング システム シグナルの使用を減らす。

非標準 Windows オプションの他の例については、「Non-Standard Options (Windows VM 用)」(を参照してください。

表 2-6 に、UNIX Solaris 上の HotSpot VM でパフォーマンスを向上させる非標準オプションの例を 2 つ示します。

表2-6 Solaris 上の HotSpot VM 用の非標準オプション

オプション

説明

-Xnoclassgc

このオプションは、指定されたクラスのガベージ コレクションを無効にして、そのクラスへのすべての参照が失われた後にそのクラスが参照されたときに、そのクラスの再ロードを防ぐ。このオプションでは、ヒープ サイズを大きくする必要がある。

-ss

このオプションは、ネイティブ スレッドのスタック サイズを設定する。大きすぎる値 (>2MB) を設定すると、パフォーマンスが大幅に低下する。

Solaris 用の非標準オプションの他の例については、「Non-Standard Options (Solaris VM 用)」(を参照してください。

 

Back to Top Previous Next