企業IT最適化のゴールを目指す

“Don’t”Stop the World――Full GCへの対策Java Review(2/3 ページ)

» 2009年06月10日 08時00分 公開
[友成文隆(日立製作所),ITmedia]

Java VMの設定見直しで対策する

 Full GCによるシステムスローダウンへのもっとも簡単な対策は、GCのアルゴリズム設定を見直すことだ。例えばSunのJDKでは、バージョン1.4.1から標準のGC(ノーマルGC)以外のGCアルゴリズムが用意されている。そのひとつが、“コンカレントGC”と呼ばれるアルゴリズムである。

 GC実行中は業務プログラムが動かないため、システムの停止時間が発生する。ただし、ノーマルGCではその処理中にずっと業務プログラムが停止していたのに対して、コンカレントGCの場合はGCの処理中にも業務プログラムをほとんど止めずに済む。これは、コンカレントGCの次のような特性によるものだ。

  1. 業務プログラムと並行してGCの処理が動作する
  2. Javaヒープ領域のOld領域に対しては空き領域を回収して再利用する。ただしこの時、メモリ域の再編成を行わない
図1 図1

 コンカレントGCでは、図1に示すように業務プログラムをほとんど止めることなく、GCの処理を実行できる。業務プログラム(図中のAP1およびAP2)が停止する時は、オブジェクトの整合性をチェックする期間などである。

 Java VMでコンカレントGCを利用するための設定方法を、以下の表に示す。

Java VMのパラメータ 設定内容
-XX:+UseConcMarkSweepGC コンカレントGCを有効にする
-XX:+CMSParallelRemarkEnabled 整合性の調査を複数スレッドで並行に実施する

コンカレントGCでも根本対策にはならない

 ここまでコンカレントGCのメリットについて説明してきたが、コンカレントGCも万能でない。業務プログラムと並行してGCを実行できることがコンカレントGCの強みだが、業務プログラムの裏でGCの処理が動作するため、業務システムのスループットに多少影響してしまう。

 また、メモリ域の再編成を行わないことで、メモリ域にフラグメンテーションが発生し、メモリ域が余っているのにメモリ不足になってしまう。この時、ノーマルGCと同様にFull GCが発生し、メモリ域の再編成が行われるため、やはり業務システム全体が停止してしまう。GCの停止時間やFull GCの頻度は少なくなるが、残念ながらFull GCの根本的な対策にはならないのである。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ