Jump to content 日本-日本語

製品  >  ソフトウェア  >  HP- UX Developer Edge

Javaのかなめ、
「ガベージ・コレクション」をやさしく学ぶ・後編

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
Javaのかなめ、「ガベージ・コレクション」をやさしく学ぶ・後編
Javaのパフォーマンス・チューニングにおいてポイントとなるのが、JVMに備わる「GCポリシー」の理解である。GCポリシーを変えるだけで、例えばシングルスレッドGC/マルチスレッドGCの違いや、GC中にアプリケーションが停止する時間などが大きく変化する。またJ2SE 5.0以降のHotSpot VMでは、「エルゴノミクス」と呼ばれる新機能により、JVMのメモリ管理にともなうチューニングが自動化されている。システムのCPU数やメモリ・サイズをJVMが検知し、世代別GCにおけるYoung領域やOld領域のサイズや、JVMのヒープ・サイズなどを自動調節するのである。ここでは、こうしたJavaのガベージ・コレクションの最新事情を紹介する。
Javaのかなめ、「ガベージ・コレクション」をやさしく学ぶ・後編
4種類のGCポリシー
Concurrent Mark-Sweep Collectorのメカニズム
2007年2月
テクニカルライター 吉川和巳

4種類のGCポリシー

Javaのパフォーマンス・チューニングを実施する上では、JVMの「GCポリシー」について理解しておくことが不可欠となる。例えばJ2SE 5.0以降のHotSpot VMでは、以下の4種類のGCポリシーを選択できる。
  • Serial Collector
  • Parallel Collector
  • Parallel Compacting Collector
  • Concurrent Mark-Sweep Collector

Serial Collector

「Serial Collector」とは、マイナーGCとメジャーGCの両方をstop-the-world方式で実行するGCポリシーである。JVMオプション「-XX:+UseSerialGC」を記述することで、このポリシーの利用を明示的に指定できる。

Serial Collectorのスレッド動作
図1:Serial Collectorのスレッド動作

上図が示すように、Serial Collectorでは、マイナーGCまたはメジャーGCの実行中はすべてのアプリケーション・スレッドが停止し、単一のGCスレッドのみ動作する。この間はJavaアプリケーションが“固まった”状態になってしまう。JVMのヒープ・サイズが大きい(例えば数100程度〜数GB程度)サーバ・アプリケーションなどでは、GCに長い時間を要するためにサービスが数秒〜数10秒間停止してしまうこともある。よって、Serial Collectorは、ヒープ・サイズが小さく(例えば64MB程度)アプリケーションの停止が1秒以下に収まるようなクライアント・アプリケーションでの利用に適している。

Parallel Collector

「Parallel Collector」とは、Serial Collectorと同様に、マイナーGCとメジャーGCの両方をstop-the-world方式で実行するGCポリシーである。JVMオプション「-XX:+UseParallelGC」を指定すれば、このポリシーを明示的に指定できる。Serial Collectorと異なる点は、マイナーGCについてはマルチスレッドによるGCを実行することだ。

Parallel Collectorのスレッド動作
図2:Parallel Collectorのスレッド動作

前述のSerial Collectorでは、マイナーGCとメジャーGCの両方をシングルスレッドで実行する。よって、もしJVMがマルチプロセッサ搭載のシステムで稼働している場合、GC実行中はいずれか1つのCPUのみ負荷がかかり、そのほかのCPUはアイドル状態となってしまう。

これに対しParallel Collectorでは、上図が示すように、マイナーGCをマルチスレッドで実行する。これにより、マルチプロセッサの能力をフルに生かした高速なGCが可能になる。よってParallel Collectorは、とりわけマルチプロセッサ搭載システムに適したGCポリシーと言える。もっとも、Parallel CollectorでもメジャーGCはシングルスレッド動作であるため、メジャーGCのパフォーマンスをさらに高めたい場合は次のParallel Compacting Collectorの利用が望ましいだろう。

Parallel Compacting Collector

「Parallel Compacting Collector」とは、Parallel Collectorの改良版と言えるGCポリシーであり、J2SE 5.0 の最新リリースでは導入済みである。Parallel Compacting Collectorでは、マイナーGCだけでなくメジャーGCのマーク&スイープもマルチスレッドで実行することで、メジャーGCにともなうアプリケーション停止時間を短縮できる。JVMオプションは「-XX:+UseParallelOldGC」だ。

マルチプロセッサ・システム上で動作するサーバ・アプリケーションでは、Parallel CollectorよりもParallel Compacting Collectorの利用が適しているだろう。GCを実行するスレッド数はCPU数に応じて自動的に決定されるが、JVMオプション「-XX:ParallelGCThreads」を指定することで、Parallel CollectorおよびParallel Compacting Collectorが消費するスレッド数の指定も可能だ。

つづく後半では、4つ目のGCポリシーであるConcurrent Mark-Sweep Collectorのメカニズムについて説明する。
トップへ   次のページへ

本ページの内容は執筆時の情報に基づいており、異なる場合があります。

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

オンラインサポート
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項