Full GCによるシステムスローダウンへのもっとも簡単な対策は、GCのアルゴリズム設定を見直すことだ。例えばSunのJDKでは、バージョン1.4.1から標準のGC(ノーマルGC)以外のGCアルゴリズムが用意されている。そのひとつが、“コンカレントGC”と呼ばれるアルゴリズムである。
GC実行中は業務プログラムが動かないため、システムの停止時間が発生する。ただし、ノーマルGCではその処理中にずっと業務プログラムが停止していたのに対して、コンカレントGCの場合はGCの処理中にも業務プログラムをほとんど止めずに済む。これは、コンカレントGCの次のような特性によるものだ。
コンカレントGCでは、図1に示すように業務プログラムをほとんど止めることなく、GCの処理を実行できる。業務プログラム(図中のAP1およびAP2)が停止する時は、オブジェクトの整合性をチェックする期間などである。
Java VMでコンカレントGCを利用するための設定方法を、以下の表に示す。
Java VMのパラメータ | 設定内容 |
---|---|
-XX:+UseConcMarkSweepGC | コンカレントGCを有効にする |
-XX:+CMSParallelRemarkEnabled | 整合性の調査を複数スレッドで並行に実施する |
ここまでコンカレントGCのメリットについて説明してきたが、コンカレントGCも万能でない。業務プログラムと並行してGCを実行できることがコンカレントGCの強みだが、業務プログラムの裏でGCの処理が動作するため、業務システムのスループットに多少影響してしまう。
また、メモリ域の再編成を行わないことで、メモリ域にフラグメンテーションが発生し、メモリ域が余っているのにメモリ不足になってしまう。この時、ノーマルGCと同様にFull GCが発生し、メモリ域の再編成が行われるため、やはり業務システム全体が停止してしまう。GCの停止時間やFull GCの頻度は少なくなるが、残念ながらFull GCの根本的な対策にはならないのである。
Copyright © ITmedia, Inc. All Rights Reserved.