本稿で対象とするJava VMはJava SE 5.0 Update11とする。バージョンにより挙動が異なる場合もあるので、実際に使用するときには動作を確認しつつ使用してもらいたい。
コンカレントGCを使用するには、Java VMの起動時に表1のオプションを指定する。
オプション | 意味 | |
---|---|---|
-XX:+UseConcMarkSweepGC | コンカレントGCの有効化 | |
さらに、表2のパラメータを状況に応じて追加する。
オプション | 意味 | |
---|---|---|
-XX:+CMSParallelRemarkEnabled | メジャーGCのRemarkフェイズをマルチスレッドで実行 | |
-XX:+UseParNewGC | マイナーGCをマルチスレッドで実行 | |
この表2のパラメータは、動作させるマシンのCPUが2個以上かつ物理メモリが2Gbytes以上の場合には、自動設定される。
コンカレントGCでも、スループットGCと同じくHeapの全体サイズを指定する。ヒープの全体サイズは、以下を考慮に入れて設定する。
実際には、アプリケーションが必要とするメモリ量を積算することは難しい。OSの空きメモリ量を基に概算で設定し、負荷試験を行いながらメモリがオーバーしていないことを確認していくケースが多い。
Heapの全体サイズは、スループットGCと同じ表3のオプションで設定する。
オプション | 意味 | デフォルト値 | |
---|---|---|---|
-Xms | Heapの最小値を指定。-Xms1024mのように、Mbyte単位での指定も可能 | 2Mbytes | |
-Xmx | Heapの最大値を指定。-Xmx1024mのように、Mbyte単位での指定も可能 | 64Mbytes | |
最小値=最大値とすることで、動的なHeapの拡大・縮小に伴う性能劣化を防ぐことが可能だ。試してみてほしい。
コンカレントGCにおいてマイナーGCを有効活用するため、表4のオプションを変更する。
オプション | 意味 | デフォルト値 | |
---|---|---|---|
-Xmn(-XX:NewSize)、 -XX:NewRatio |
New世代領域に割り当てるサイズを指定。NewRatioはOld世代領域との比率で指定し、NewSizeはサイズで指定 | -XX:NewRatio=12 | |
-XX:SurvivorRatio | Eden領域とSurvivor領域のサイズを比率で指定 | コンカレントGCを使用すると、1024 | |
-XX:MaxTenuringThreshold | New世代領域において、オブジェクトがこの値で指定する回数のマイナーGCを超えて生き残ると、Old世代領域に移動 | コンカレントGCを使用すると、0 | |
-XX:TargetSurvivorRatio | Survivor領域がいっぱいと判断される使用率 | 50% | |
具体的にどのような数値に変更すればよいかは、アプリケーションの作りや環境によって異なる。そこで、以下では簡単なベンチマークを実施して、コンカレントGCの有効性について確認してみよう。
以下の3つのパターンで性能を比較してみよう。
なお、ベンチマークにはIPAのOSS活用整備基盤事業で開発したJBentoStoreを使用した。
ベンチマークは表5に示す環境上で行った。
CPU | Intel Pentium 4 3.2Gbytes | |
メモリ | 2Gbytes | |
OS | Red Hat ES4 U3 | |
Java VM | Java SE 5.0 Update11 | |
APサーバ | Tomcat 5.5.23 | |
評価対象ソフトウェア | JBentoStore 1.0 | |
指定したJVMパラメータは、以下のとおり。
スループットと平均応答時間のグラフを図4、図5に示す。
New世代領域チューニングなしのコンカレントGCでは、150クライアントまではそのほかのGCと同じ性能だが、200クライアント時に13%程度スループットが劣化した。一方、チューニングを行ったコンカレントGCはスループットGCに対して、性能劣化が殆どない。
このように、マイナーGCを使用するようにチューニングされたコンカレントGCは、理想的な性能を満たしている。
本記事では、マイナーGCをうまく活用するコンカレントGCの仕組みや設定について解説し、またベンチマーク結果も示した。コンカレントGCは比較的新しく出てきたGC方式であり、その使用に不安を感じる人もいるかもしれない。しかし、本記事で紹介したチューニングを行えば、十分に使いこなせるはずだ。
筆者は、コンカレントGCがすでに現場で使えるレベルに成熟していると考えている。Full GCに悩んでいる方は、コンカレントGCの導入を検討してみてはいかがだろうか。
金子 崇之(かねこ たかゆき)
NTTデータ先端技術株式会社 オープンソース事業部所属。
入社よりJavaを用いたWebシステムの開発支援にかかわる。最近では、主にオープンソースのアプリケーションサーバに関する検証や技術支援、トラブルシューティングに明け暮れている
Copyright © ITmedia, Inc. All Rights Reserved.