3 Java仮想マシン(JVM)のチューニング
- JVMのチューニングの考慮事項
WebLogic ServerにおけるJVMのチューニングに関する一般的な考慮事項について検討します。 - 他のJVMへの変更
ドメインを作成する場合、ドメインを実行するJVMを選択すると、構成ウィザードではその選択に基づいてOracle起動スクリプトが構成されます。JVMを変更するには、構成ウィザードのJAVA_HOME
およびJAVA_VENDOR
変数の値を変更します。 - ガベージ・コレクション
ガベージ・コレクションは、Javaヒープ内の使用されていないJavaオブジェクトを解放するVMのプロセスです。 - 管理対象サーバーのJavaヒープ・サイズの増加
パフォーマンスを向上させるため、環境内の各管理対象サーバーのヒープ・サイズを増やします。
JVMのチューニングの考慮事項
WebLogic ServerにおけるJVMのチューニングに関する一般的な考慮事項について検討します。
次の表は、WebLogic ServerにおけるJVMのチューニングに関する一般的な考慮事項を示しています。
表3-1 JVMのチューニングの一般的な考慮事項
チューニング事項 | 参照情報 |
---|---|
JVMのベンダーおよびバージョン |
WebLogic Serverの動作が確認されている製品JVMだけを使用します。 各プラットフォームの最新の動作確認情報へのリンクは、『Oracle WebLogic Serverの新機能』のサポートされている構成に関する項を参照してください。 |
ヒープ・サイズおよびガベージ・コレクションのチューニング |
WebLogic Serverのヒープ・サイズ・チューニングの詳細は、「ガベージ・コレクション」を参照してください。 |
ガベージ・コレクションの方式の選択 |
システム・メモリーの管理に使用できるガベージ・コレクションの方式は、アプリケーションによって異なります。詳細は、「ガベージ・コレクションの方式の選択」を参照してください。 |
クライアント/サーバーJVMの混在 |
WebLogic Serverでは、クライアントとサーバー用に異なるJVMバージョンを使用したデプロイメントがサポートされています。 |
UNIXスレッディング・モデル |
Solarisスレッディング・モデルに関する選択は、Solaris上のJVMのパフォーマンスに大きく影響します。モデル内で複数のスレッディング・モデルと異なる同期方式を選択できますが、これはJVMによって異なります。 Java Hotspot仮想マシンのスレッド用のパフォーマンス・ドキュメント( |
親トピック: Java仮想マシン(JVM)のチューニング
他のJVMへの変更
ドメインを作成する場合、ドメインを実行するJVMを選択すると、構成ウィザードではその選択に基づいてOracle起動スクリプトが構成されます。JVMを変更するには、構成ウィザードのJAVA_HOME
およびJAVA_VENDOR
変数の値を変更します。
ドメインの作成後、別のJVMを使用する場合、『Oracle WebLogic Serverサーバーの起動と停止の管理』のサーバーを実行するJVMの変更に関する項を参照してください。
親トピック: Java仮想マシン(JVM)のチューニング
ガベージ・コレクション
ガベージ・コレクションは、Javaヒープ内の使用されていないJavaオブジェクトを解放するVMのプロセスです。
次の項では、VMのガベージ・コレクションのチューニングに関する情報を示します。
- VMのヒープ・サイズとガベージ・コレクション
- ガベージ・コレクションの方式の選択
- verboseガベージ・コレクションを使用したヒープ・サイズの決定
- ヒープ・サイズ値の指定
- ヒープ・サイズのチューニングのヒント
- Java HotSpot VMヒープ・サイズのオプション
- ガベージ・コレクションの手動によるリクエスト
- スレッド・スタックのリクエスト
親トピック: Java仮想マシン(JVM)のチューニング
VMのヒープ・サイズとガベージ・コレクション
Javaヒープは、Javaプログラムのオブジェクトが存在する場所です。ライブ・オブジェクト、デッド・オブジェクト、およびフリー・メモリーのリポジトリです。実行中のプログラムでどのポインタからもアクセスされなくなると、オブジェクトは「ガベージ(廃棄物)」と見なされ、コレクションの対象となります。ベスト・プラクティスとしては、ガベージ・コレクションに費やされる時間を、実行時間の5%以内にチューニングします。
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を構成するには、「ヒープ・サイズ値の指定」を参照してください。
親トピック: ガベージ・コレクション
ガベージ・コレクションの方式の選択
システム・メモリーの管理に使用するガベージ・コレクションは、どのJVMを使用しているかに応じて複数の方式の中から選択できます。たとえば、特定のタイプのアプリケーションには、それに適したガベージ・コレクションの方式があります。アプリケーションの負荷や、JVMによって使用されるガベージ・コレクション・アルゴリズムの違いを理解すると、ガベージ・コレクションの構成を最適化できます。
Sun社のHotSpot VMで利用可能なガベージ・コレクション方式の概要は、『Java Platform, Standard Edition HotSpot仮想マシン・ガベージ・コレクション・チューニング・ガイド』(https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html
)を参照してください。
親トピック: ガベージ・コレクション
verboseガベージ・コレクションを使用したヒープ・サイズの決定
verboseガベージ・コレクション・オプション(verbosegc
)を使用すると、ガベージ・コレクションに費やされる時間とリソースを正確に測定できます。最も効率的なヒープ・サイズを判断するには、診断を目的としてverboseガベージ・コレクションを有効にし、出力をログ・ファイルにリダイレクトします。
次のステップは、この手順を簡単に示します。
-
アプリケーション実行中に、最大の負荷をかけた状態でWebLogic Serverのパフォーマンスをモニターします。
-
-verbosegc
オプションを使用してJVMのverboseガベージ・コレクション出力を有効にし、標準エラーおよび標準出力の両方をログ・ファイルにリダイレクトします。リダイレクトすることにより、スレッド・ダンプ情報がWebLogic Serverの情報メッセージとエラー・メッセージに関連してログに記録されるので、診断する際にログ・ファイルがさらに役立ちます。
たとえば、WindowsおよびSolarisでは次のように入力します。
% java -ms32m -mx200m -verbosegc -classpath $CLASSPATH -Dweblogic.Name=%SERVER_NAME% -Dbea.home="C:\Oracle\Middleware" -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
コマンドは、標準エラーと標準出力の両方をログ・ファイルにリダイレクトします。 -
次のデータ・ポイントを解析します。
-
ガベージ・コレクションの実行頻度。weblogic.logファイルで、ガベージ・コレクション前後のタイム・スタンプを比較します。
-
ガベージ・コレクションの実行時間。完全ガベージ・コレクションの実行時間は3 - 5秒を上回ってはいけません。
-
平均メモリー占有量。つまり、各完全ガベージ・コレクション後にヒープがどのような状態になるかです。ヒープの空きが常に85%になる場合、ヒープ・サイズを小さくしてもかまいません。
-
-
New世代のヒープ・サイズを確認します。「Java HotSpot VMヒープ・サイズのオプション」を参照してください。
-
ヒープ・サイズがシステムの使用可能な空きRAMより大きくならないようにします。
ページがディスクに「スワップ」されない範囲で、できるだけ大きいヒープ・サイズを設定します。システムの空きRAMの容量は、ハードウェアの構成と、そのマシン上で実行されているプロセスのメモリー要件によって異なります。システムの空きRAMの容量の決定については、システム管理者に問い合わせてください。
-
システムがガベージ・コレクションに費やす時間が長すぎる場合(割り当てられた仮想メモリーをRAMが処理できない場合)、ヒープ・サイズを小さくします。
通常、使用可能なRAM (オペレーティング・システムまたはその他のプロセスによって占有されないRAM)の80%をJVMに割り当てます。
-
使用可能な空きRAMが大量に残っている場合は、そのマシンでより多くのWebLogic Serverインスタンスを実行します。
もう一度確認しますが、ヒープ・サイズのチューニングの目標は、WebLogic Serverで所定の時間に処理できるクライアントの数を最大限に増やしつつ、JVMによるガベージ・コレクションの実行時間を最小限に抑えることです。
親トピック: ガベージ・コレクション
ヒープ・サイズ値の指定
システム・パフォーマンスは、JVMで利用可能なJavaヒープのサイズによって大きく影響されます。この節では、ヒープ・サイズ値の定義に使用するコマンド行オプションについて説明します。Javaヒープ・サイズ値は、WebLogic Serverのインスタンスを起動するたびに指定する必要があります。ヒープ・サイズ値は、java
コマンド行から指定するか、WebLogic Server起動用にWebLogic配布キットに付属しているサンプル起動スクリプトのデフォルト値を変更して指定します。
親トピック: ガベージ・コレクション
ヒープ・サイズのチューニングのヒント
次の項では、VMヒープ・サイズのチューニングに関する一般的なガイドラインを示します。
-
ヒープ・サイズは、VMによって使用される最大メモリー量が、利用可能な物理的なRAM量を超えないような値に設定する必要があります。この値を超えると、OSがページングを開始するため、パフォーマンスが大幅に低下します。VMでは、常にヒープ・サイズより多いメモリーが消費されます。内部VM機能に必要なメモリー、VMの外部のネイティブ・ライブラリのメモリー、および永続世代メモリー(Sun VMのみ。クラスおよびメソッドの格納に必要なメモリー)が、ヒープ・サイズの設定の他に割り当てられます。
-
世代別ガベージ・コレクション方式を使用する場合、保護領域のサイズは、合計Javaヒープ・サイズの半分を超えないようにする必要があります。一般的には、ヒープ・サイズの25 - 40%が適切です。
-
本番環境では、ヒープを常に拡張したり縮小したりするために使用されるVMリソースを浪費しないように、最小ヒープ・サイズと最大ヒープ・サイズを同じ値に設定します。これは、New世代のヒープ・サイズにも適用されます。
親トピック: ガベージ・コレクション
Java HotSpot VMヒープ・サイズのオプション
最高のパフォーマンスは、アプリケーションを個別にチューニングすることで実現されます。ただし、WebLogic Serverの起動時に、次の表のJava HotSpot VMヒープ・サイズ・オプションを構成すると、ほとんどのアプリケーションでパフォーマンスを向上させることができます。
これらのオプションは、使用するアーキテクチャおよびオペレーティング・システムによって異なります。プラットフォーム別のJVMチューニング・オプションについては、ベンダーのドキュメントを参照してください。
表3-2 Javaヒープ・サイズ・オプション
タスク | オプション | 説明 |
---|---|---|
New世代領域のヒープ・サイズを設定する |
-XX:NewSize |
一般に プロセッサ数が増加するほど、New世代領域を大きく設定する必要があります。メモリーの割当ては並列処理できますが、ガベージ・コレクションは並列処理されません。 |
New世代領域の最大ヒープ・サイズを設定する |
-XX:MaxNewSize |
New世代領域のヒープ・サイズの最大サイズを設定します。 |
New世代領域のヒープ・サイズ比率を設定する |
-XX:SurvivorRatio |
New世代領域は、3つのサブ領域、つまりEdenと、同じサイズの2つのサバイバル領域に分割されます。 Edenとサバイバル領域の比率を構成します。この値は8に設定し、その後、ガベージ・コレクションをモニターするようにします。 |
ヒープ・サイズの初期値を設定する |
-Xms |
一般的なルールとしては、ガベージ・コレクションを最小限にするために、ヒープ・サイズの初期値( |
最大ヒープ・サイズを設定する |
-Xmx |
ヒープ・サイズの最大サイズを設定します。 |
たとえば、java
コマンド行からWebLogic Serverインスタンスを起動する場合、HotSpot VMヒープ・サイズの値は次のように指定できます。
$ java -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8 -Xms512m -Xmx512m
これらの値のデフォルト・サイズはバイト単位で指定されます。KB (キロバイト)を示すには、値に「k」または「K」を付加します。同様に、MB (メガバイト)を示すには「m」または「M」を、GB (ギガバイト)を示すには「g」または「G」を付加します。上記の例では、New世代およびNew世代の最大ヒープ・サイズに128MB、JVMで実行しているWebLogic Serverインスタンスの最小および最大ヒープ・サイズに512MBを割り当てています。
Java HotSpot VMのその他のオプション
VMのパフォーマンスを向上させるその他の標準および非標準のコマンド行オプションが用意されています。これらのオプションの使用方法は、使用するアプリケーションのコーディングによって異なります。
クライアントJVMとサーバーJVMの両方をテストすると、特定のアプリケーションに対してよりパフォーマンスの優れたオプションを調べることができます。HotSpot VMオプションのその他の例については次を参照してください:
-
Windows (Win32) VM用標準オプション(
http://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
)。 -
Solaris VMおよびLinux VM用標準オプション(
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
)。
Java SEのJava仮想マシンのクライアントおよびサーバーの実装の詳細は、Java仮想マシン のドキュメント(http://docs.oracle.com/javase/8/docs/technotes/guides/vm/
)に記載されています。
親トピック: Java HotSpot VMヒープ・サイズのオプション
ガベージ・コレクションの手動によるリクエスト
WebLogic Server管理コンソールから完全ガベージ・コレクションを手動でリクエストする必要が生じる場合があります。その場合、JVMがヒープ内のすべての有効なオブジェクトを調べることが多くあるため、ガベージ・コレクションに対してコストがかかることに注意してください。Oracle WebLogic Server管理コンソール・オンライン・ヘルプのガベージ・コレクションの手動によるリクエストに関する項を参照してください。
親トピック: ガベージ・コレクション
スレッド・スタックのリクエスト
アプリケーションをチューニングするときに、スレッド・スタックを表示する必要がある場合があります。Oracle WebLogic Server管理コンソール・オンライン・ヘルプのスレッド・スタックの表示に関する項を参照してください。
親トピック: ガベージ・コレクション
管理対象サーバーのJavaヒープ・サイズの増加
パフォーマンスを向上させるため、環境内の各管理対象サーバーのヒープ・サイズを増やします。
次の項では、管理対象サーバーのJavaヒープ・サイズを変更する方法について説明します。
『Oracle WebLogic Serverノード・マネージャの管理』のリモート起動引数の構成に関する項を参照してください。
- 管理コンソールを使用したJavaヒープ・サイズの設定
- startManagedWebLogicスクリプトの変更によるJavaヒープ・サイズの設定
- コマンド行を使用したJavaヒープ・サイズの設定
- 管理対象サーバーによって使用されるメモリー値の決定
親トピック: Java仮想マシン(JVM)のチューニング
管理コンソールを使用したJavaヒープ・サイズの設定
ノード・マネージャを使用して管理対象サーバーを起動する場合、「サーバーの起動」タブで、管理対象サーバーごとにヒープ・サイズをJava引数として指定できます。Oracle WebLogic Server管理コンソール・オンライン・ヘルプの管理対象サーバーのJavaヒープ・サイズの増加に関する項を参照してください。ヒープ・サイズ値は、サーバーのstartup.properties
ファイルに保存されます。
親トピック: 管理対象サーバーのJavaヒープ・サイズの増加
startManagedWebLogicスクリプトの変更によるJavaヒープ・サイズの設定
JAVA_OPTIONS
に必要なヒープ・サイズを指定して、startManagedWebLogic
スクリプトを更新できます。たとえば:
JAVA_OPTIONS="-Xms2g -Xmx2g" ${JAVA_OPTIONS}
『Oracle WebLogic Serverサーバーの起動と停止の管理』の起動スクリプトによる管理対象サーバーの起動に関する項を参照してください。
親トピック: 管理対象サーバーのJavaヒープ・サイズの増加
コマンド行を使用したJavaヒープ・サイズの設定
管理対象サーバーの起動時にJVMパラメータを渡すには、Javaコマンドでweblogic.Server
クラスを起動します。『Oracle WebLogic Serverコマンド・リファレンス』のweblogic.Serverコマンドライン・リファレンスに関する項を参照してください。
親トピック: 管理対象サーバーのJavaヒープ・サイズの増加
管理対象サーバーによって使用されるメモリー値の決定
起動スクリプトおよび管理コンソール(startup.properties
ファイル)は、管理対象サーバーのメモリー引数を構成するための一般的な方法です。多くの場合、それらは複数の場所で、異なる値で設定されます。実行中の管理対象サーバーで実際にどの値を使用するのかをどのように決定するのでしょうか。
実行中の管理対象サーバーは、常に、起動時にそのサーバーに最後に渡されたメモリー引数のセットを使用します。これは、ログ・ファイルを調べることで確認できます。メモリー引数が複数回リストされている場合、出力の最後のセットに、サーバーによって使用された値が含まれています。管理コンソールを使用して値を設定した場合は、「管理コンソールを使用したJavaヒープ・サイズの設定」を参照してください。startup.properties
ファイルは、常に、すべてのスクリプトの後で最後に処理されています。これは、共通のスクリプトを使用する場合に個別の管理対象サーバーのメモリー・サイズをチューニングする便利な方法を提供します。環境で実際に使用されていないメモリー引数を含めたくない場合、管理対象サーバーの起動に使用されるスクリプトから、MEM_ARGS
やJAVA_OPTONS
などの無関係なメモリー引数を削除する必要があります。
親トピック: 管理対象サーバーのJavaヒープ・サイズの増加