JRockit JDK ユーザーズ ガイド
![]() |
![]() |
![]() |
![]() |
メモリ管理は効率的な「ガベージ コレクション」に依存しています。ガベージ コレクションとは、ヒープから不要になったオブジェクトを消去して、その領域を新しいオブジェクトのために解放するプロセスです。BEA JRockit では、2 つの優先順位 (メモリ スループット、またはコレクションによって生じた休止時間の長さ) のいずれかに基づいて動作する動的なガベージ コレクタを使用します。この動的なガベージ コレクタは、あらかじめ定義されたヒューリスティックに基づいて、アプリケーションごとに使用するガベージ コレクション アルゴリズムを実行時に決定します。
メモリを解放する方法として、動的なガベージ コレクションが最適でない場合もあります。そのような場合に備えて、BEA JRockit には「静的な」コレクタも数多く用意されています。静的なコレクタを使用するには、起動時に実際のコレクタを指定します (-Xgc:<
collectorName
>
)。
この節では、これらのガベージ コレクション方式の使い方について説明します。内容は以下のとおりです。
JRockit のガベージ コレクタは、世代別としてもシングルスペースとしても (つまり、「ナーサリ」の有無にかかわらず) 動作する「マークアンドスイープ」コレクタです (後述の「二世代のガベージ コレクション」を参照してください)。マークアンドスイープ ガベージ コレクションは、コンカレント アルゴリズムまたはパラレル アルゴリズムのどちらかとして実装されます。
マークアンドスイープ コレクタは参照されていないすべてのオブジェクトを解放し、次の手順のように動作します。
JRockit のガベージ コレクタでは、以下に示す 2 つのガベージ コレクタ オプションを組み合わせることもできます。
以下の 2 つのガベージ コレクション アルゴリズムのさまざまな組み合わせ (または「ステート」) で構成されます。
二世代のガベージ コレクションでは、ヒープが 2 つのセクション、つまり、古い世代と若い世代 (ナーサリ) に分割されます。オブジェクトがナーサリに割り当てられて、ナーサリが一杯になると、JRockit はすべての Java スレッドを停止し、生存しているオブジェクトを若い世代 (ナーサリ) から古い世代に移動します。
ガベージ コレクションのシングルスペース オプションの場合、すべてのオブジェクトは、経過時間に関係なく、ヒープ上の 1 つの領域内で生存期間を過ごします。つまり、シングルスペース ガベージ コレクタにはナーサリはありません。
コンカレント ガベージ コレクション アルゴリズムでは、他のすべての処理と「コンカレント」(同時) に、マークとスイープを行います。つまり、Java スレッドを停止しないでガベージ コレクションを完了します。
パラレル ガベージ コレクション アルゴリズムでは、ヒープが一杯になったときに Java スレッドを停止し、すべての CPU を使用して、ヒープ全体のマークとスイープを完了します。パラレル コレクタはコンカレント コレクタよりも休止時間が長くなりますが、アプリケーションのスループットを最大にします。このようにパフォーマンスが最大になるため、アプリケーションで長い休止時間を許容できる場合は、シングル CPU マシン上でもパラレル ガベージ コレクタをお勧めします。
動的なガベージ コレクタは JRockit のデフォルトのガベージ コレクタであり、上記のオプションとアルゴリズムがガベージ コレクションのマークアンドスイープ モデルの中で組み合わされています。このガベージ コレクタは、使用するヒューリスティックに応じて、コンカレントまたはパラレルのマーク フェーズと、コンカレントまたはパラレルのスイープ フェーズにおいて、二世代のコレクタまたはシングルスペース コレクタを採用します。
動的なガベージ コレクタの大きな利点は、コレクション中の最適なメモリ スループットと最小の休止時間のどちらの方がアプリケーションにとって効果的なのかを決定するだけで、最適なパフォーマンスが得られるという点です。自分のアプリケーションの動作を理解しているだけでよく、ガベージ コレクション アルゴリズムやさまざまな組み合わせについて理解する必要はありません。
動的なガベージ コレクタを起動するには、-Xgcprio
コマンドライン オプションを使用し、優先順位に応じて throughput
パラメータまたは pausetime
パラメータを指定します。
-Xgcprio:<throughput|pausetime>
pausetime パラメータを指定する場合は、次に示すように、ガベージ コレクションの目標休止時間を設定することもできます。
-Xgcpausetarget=400ms
表 3-1 に、動的なガベージ コレクタを起動する際の優先順位と、その優先順位の選択に使用するパラメータを示します。
優先順位を選択して JVM を起動すると、動的なガベージ コレクタは優先順位に基づいてパフォーマンスを最適化するガベージ コレクション ステートを選択します。-Xgcprio:throughput
が設定されている場合はスループットを最適化する方法、-Xgcprio:pausetime
が設定されている場合は休止時間を可能な限り最小限に抑える方法を追求します。
状況によっては、動的なガベージ コレクタを使用しない方がよいこともあります。このような場合は、3 つある静的なガベージ コレクタのいずれかを使用するとよいでしょう。静的なガベージ コレクタを使用しても、アルゴリズムの変更によるパフォーマンスの最適化は行われません。これらのガベージ コレクタは、JRockit の古いバージョンから実装されているオリジナルのガベージ コレクタです。場合によっては、これらのガベージ コレクタのパフォーマンスの方が、動的なガベージ コレクタよりニーズに適していることがあります。また、JRockit の古いバージョン用に記述したスクリプトがあり、その中でこれらのコレクタを実装している場合、そのスクリプトは一切修正することなく引き続き使用できます。ただし、スクリプトでコピー ガベージ コレクタを使用している場合は除きます (コピー ガベージ コレクタは使用できなくなりました)。
使用できるガベージ コレクタ (と起動するコマンド) は次のとおりです。
-Xgc:singlecon
、BEA JRockit が -client
モードで動作しているときのデフォルトのガベージ コレクタ)-Xgc:gencon
)-Xgc:parallel
)-Xgc
を設定すると、-Xgcprio
とデフォルト設定がオーバーライドされます。
表 3-2 は、アプリケーションに適したガベージ コレクタを決定するために使用できるマトリックスです。「状況」列でアプリケーションに合う状況を見つけて、「選択するガベージ コレクタ」列に示されたガベージ コレクタを選択してください。3 番目の「動的なガベージ コレクタの場合」列は、サポートされている別のガベージ コレクタを示します。
ガベージ コレクションの動作を観察するには、以下のいずれかの方法を使用します。これを使用すると、選択したガベージ コレクタの効果を評価して、必要なチューニング方法を判断することができます。
-Xverbose:memory
オプションを起動時に使用します。すると、この情報がコンソール ウィンドウに表示されるようになります。-Xgcreport
を入力します。このオプションを使用すると、アプリケーションの実行が完了したときにガベージ コレクションの包括的なレポートが出力されます。-Xgcpause
オプションを指定します。このオプションを指定すると、Java スレッドがガベージ コレクションのために停止されるたびに VM が 1 行ずつ出力します。
![]() ![]() |
![]() |
![]() |