続いて、WAS 6.1のIBM JVMが採用しているGC方式の調整に用いる“-Xgcpolicy:”の設定について説明をします。
WAS 6.1のIBM JVMでは、“-Xgcpolicy:”の指定が4種類提供されています。
- Throughputの最適化(-Xgcpolicy:optthruput、デフォルト設定)
フラット・ヒープを採用。スループット重視。Parallel Collector(Stop The World)、Parallel Mark、Parallel Sweep
- Pause Timeの最適化(-Xgcpolicy:optavgpause)
フラット・ヒープを採用。Concurrent Collector(GCポーズタイムを最小化)、Concurrent Mark、Concurrent Sweep
- Generational Concurrent(-Xgcpolicy:gencon)
分割ヒープを採用。Nursery AreaはParallel Collector(Stop The World)、Copying GC。Tenured AreaはConcurrent Collector、Concurrent Mark、Concurrent Sweep
- Subpool(-Xgcpolicy:subpool)
フラット・ヒープを採用。スループット重視。Parallel Collector(Stop-the-world)、Parallel Mark、Parallel Sweep。大規模SMP環境用にオブジェクト・アロケーション・アルゴリズムを最適化。AIX、Linux PPC、zSeries、z/OS、i5/OSでのみサポート
どのオプションを選択するかの目安を以下に記します。
- アプリケーションのスループット重視
-Xgcpolicy:optthruput
- アプリケーションのレスポンスを重視し、GCによる影響を抑える
-Xgcpolicy:optavgpause
- アプリケーションが生成するオブジェクトが短命である
-Xgcpolicy:gencon
- アプリケーションが多量のスレッドを使用し(大規模SMPマシン環境)、多くのオブジェクトをアロケーション
-Xgcpolicy:subpool
これらの指定は、WASのJava仮想マシンに対する設定(汎用JVM引数)で行います。
図13 Java仮想マシンの設定
次に、IBM JVMだけではない、汎用JVMの主なチューニング・パラメータについて紹介していきます。
物理メモリ容量を考慮した設定が必要です。物理メモリ以上の値を指定した場合に、swapが発生して性能に多大な影響を与える危険があります。
- -Xms
最小ヒープ・サイズ(WAS管理コンソール上は、初期ヒープ・サイズに指定)
- -Xmx
最大ヒープ・サイズ(WAS管理コンソール上は、最大ヒープ・サイズに指定)
Nursery Spaceの適切なサイズを求めるためには、GCのログを解析し、Scavenge GCの発生頻度およびScavengeにかかった時間を把握し、サイズを調整しながら何回かテストを繰り返す必要があります。
- スループット重視
Nurseryサイズを大きく
- ポーズ時間重視
Nurseryサイズを小さく
- -Xmn
固定のNurseryサイズの指定(WAS管理コンソール上は、汎用JVM引数に指定)
- -Xmns
Nurseryサイズの最小値の指定(WAS管理コンソール上は、汎用JVM引数に指定)
- -Xmnx
Nurseryサイズの最大値の指定(WAS管理コンソール上は、汎用JVM引数に指定)
Tenured Spaceは、アプリケーションのすべてのパーシスタントデータを保持するのに十分な容量が必要です。小さすぎる場合にはGCが多発し、場合によっては、OutOfMemoryエラーが発生します。
- -Xmo
固定のTenuredサイズの指定(WAS管理コンソール上は、汎用JVM引数に指定)
- -Xmos
Tenuredサイズの最小値の指定(WAS管理コンソール上は、汎用JVM引数に指定)
- -Xmox
Tenuredサイズの最大値の指定(WAS管理コンソール上は、汎用JVM引数に指定)
図14 NurseryサイズおよびTenuredサイズ
- -Xgcthreads<n>
<n>にスレッド数を指定。デフォルト値は、合計プロセッサ数から−1(WAS管理コンソール上は、汎用JVM引数に指定)
- -Xlp
Large pageサポートを使用する場合に指定。ただし、OSレベルでのLarge pageの設定も併せて調整する必要がある(WAS管理コンソール上は、汎用JVM引数に指定)
これらオプションの設定において、最適な値を見つけるためには、何回か異なる値を指定しながらテストを繰り返す、という手順を踏む必要があります。
以下に、GCチューニングを行う際に手助けとなるツールを紹介します。