ナビゲーションをスキップ

JRockit JDK ユーザーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

BEA JRockit メモリ管理システムの使い方

メモリ管理は効率的な「ガベージ コレクション」に依存しています。ガベージ コレクションとは、ヒープから不要になったオブジェクトを消去して、その領域を新しいオブジェクトのために解放するプロセスです。BEA JRockit では、2 つの優先順位 (メモリ スループット、またはコレクションによって生じた休止時間の長さ) のいずれかに基づいて動作する動的なガベージ コレクタを使用します。この動的なガベージ コレクタは、あらかじめ定義されたヒューリスティックに基づいて、アプリケーションごとに使用するガベージ コレクション アルゴリズムを実行時に決定します。

メモリを解放する方法として、動的なガベージ コレクションが最適でない場合もあります。そのような場合に備えて、BEA JRockit には「静的な」コレクタも数多く用意されています。静的なコレクタを使用するには、起動時に実際のコレクタを指定します (-Xgc:<collectorName>)。

この節では、これらのガベージ コレクション方式の使い方について説明します。内容は以下のとおりです。

 


マークアンドスイープ コレクション モデル

JRockit のガベージ コレクタは、世代別としてもシングルスペースとしても (つまり、「ナーサリ」の有無にかかわらず) 動作する「マークアンドスイープ」コレクタです (後述の「二世代のガベージ コレクション」を参照してください)。マークアンドスイープ ガベージ コレクションは、コンカレント アルゴリズムまたはパラレル アルゴリズムのどちらかとして実装されます。

マークアンドスイープ コレクタは参照されていないすべてのオブジェクトを解放し、次の手順のように動作します。

  1. 「マーク」フェーズでは、アクセス可能なプログラムのルート (通常はグローバル、スタック、レジスタ) を起点にすべてのポインタを通過し、通過済みの個々のオブジェクトをマークします。
  2. 「スイープ」フェーズでは、ヒープを直線的に通過し直し、マークされていないすべてのオブジェクトを削除します。

 


ガベージ コレクタのオプション

JRockit のガベージ コレクタでは、以下に示す 2 つのガベージ コレクタ オプションを組み合わせることもできます。

以下の 2 つのガベージ コレクション アルゴリズムのさまざまな組み合わせ (または「ステート」) で構成されます。

二世代のガベージ コレクション

二世代のガベージ コレクションでは、ヒープが 2 つのセクション、つまり、古い世代と若い世代 (ナーサリ) に分割されます。オブジェクトがナーサリに割り当てられて、ナーサリが一杯になると、JRockit はすべての Java スレッドを停止し、生存しているオブジェクトを若い世代 (ナーサリ) から古い世代に移動します。

一世代のガベージ コレクション

ガベージ コレクションのシングルスペース オプションの場合、すべてのオブジェクトは、経過時間に関係なく、ヒープ上の 1 つの領域内で生存期間を過ごします。つまり、シングルスペース ガベージ コレクタにはナーサリはありません。

コンカレント ガベージ コレクション

コンカレント ガベージ コレクション アルゴリズムでは、他のすべての処理と「コンカレント」(同時) に、マークとスイープを行います。つまり、Java スレッドを停止しないでガベージ コレクションを完了します。

パラレル ガベージ コレクション

パラレル ガベージ コレクション アルゴリズムでは、ヒープが一杯になったときに Java スレッドを停止し、すべての CPU を使用して、ヒープ全体のマークとスイープを完了します。パラレル コレクタはコンカレント コレクタよりも休止時間が長くなりますが、アプリケーションのスループットを最大にします。このようにパフォーマンスが最大になるため、アプリケーションで長い休止時間を許容できる場合は、シングル CPU マシン上でもパラレル ガベージ コレクタをお勧めします。

 


動的なガベージ コレクタ

動的なガベージ コレクタは JRockit のデフォルトのガベージ コレクタであり、上記のオプションとアルゴリズムがガベージ コレクションのマークアンドスイープ モデルの中で組み合わされています。このガベージ コレクタは、使用するヒューリスティックに応じて、コンカレントまたはパラレルのマーク フェーズと、コンカレントまたはパラレルのスイープ フェーズにおいて、二世代のコレクタまたはシングルスペース コレクタを採用します。

動的なガベージ コレクタの大きな利点は、コレクション中の最適なメモリ スループットと最小の休止時間のどちらの方がアプリケーションにとって効果的なのかを決定するだけで、最適なパフォーマンスが得られるという点です。自分のアプリケーションの動作を理解しているだけでよく、ガベージ コレクション アルゴリズムやさまざまな組み合わせについて理解する必要はありません。

動的なガベージ コレクタを起動するには、-Xgcprio コマンドライン オプションを使用し、優先順位に応じて throughput パラメータまたは pausetime パラメータを指定します。

-Xgcprio:<throughput|pausetime>

pausetime パラメータを指定する場合は、次に示すように、ガベージ コレクションの目標休止時間を設定することもできます。

-Xgcpausetarget=400ms

表 3-1 に、動的なガベージ コレクタを起動する際の優先順位と、その優先順位の選択に使用するパラメータを示します。

表 3-1 -Xgcprio オプションの優先順位

優先順位

説明

アプリケーションのスループット

(-Xgcprio:throughput)

ガベージ コレクタはアプリケーションのスループットを重視する方向で最適化されます。この場合、ガベージ コレクタは最大限に効率的に動作し、できるだけ多くの CPU リソースを Java スレッドに回します。ただし、ガベージ コレクタがガベージ コレクションのためにすべての Java スレッドを停止させた場合、休止時間は不定です。スループットを重視するのは、不定の休止時間がアプリケーションの動作に悪影響を及ぼさない場合にしてください。

休止時間

(-Xgcprio:pausetime)

ガベージ コレクタは、各ガベージ コレクション休止時間 (つまりすべての Java スレッドが休止する時間) が制限されるように最適化されます。この場合、ガベージ コレクタがスループット重視の場合より合計で多くの CPU リソースを消費するため、アプリケーションのスループットの低下を招きます。休止時間を重視するのは、アプリケーションのパフォーマンスを均等に保つ必要がある場合にしてください。ガベージ コレクションの目標休止時間を設定するには、-Xpausetarget を使用します。

優先順位を選択して JVM を起動すると、動的なガベージ コレクタは優先順位に基づいてパフォーマンスを最適化するガベージ コレクション ステートを選択します。-Xgcprio:throughput が設定されている場合はスループットを最適化する方法、-Xgcprio:pausetime が設定されている場合は休止時間を可能な限り最小限に抑える方法を追求します。

 


下位互換性のあるガベージ コレクタの使用

状況によっては、動的なガベージ コレクタを使用しない方がよいこともあります。このような場合は、3 つある静的なガベージ コレクタのいずれかを使用するとよいでしょう。静的なガベージ コレクタを使用しても、アルゴリズムの変更によるパフォーマンスの最適化は行われません。これらのガベージ コレクタは、JRockit の古いバージョンから実装されているオリジナルのガベージ コレクタです。場合によっては、これらのガベージ コレクタのパフォーマンスの方が、動的なガベージ コレクタよりニーズに適していることがあります。また、JRockit の古いバージョン用に記述したスクリプトがあり、その中でこれらのコレクタを実装している場合、そのスクリプトは一切修正することなく引き続き使用できます。ただし、スクリプトでコピー ガベージ コレクタを使用している場合は除きます (コピー ガベージ コレクタは使用できなくなりました)。

使用できるガベージ コレクタ (と起動するコマンド) は次のとおりです。

ガベージ コレクタのオーバーライド

-Xgc を設定すると、-Xgcprio とデフォルト設定がオーバーライドされます。

 


ガベージ コレクタを選択するためのマトリックス

表 3-2 は、アプリケーションに適したガベージ コレクタを決定するために使用できるマトリックスです。「状況」列でアプリケーションに合う状況を見つけて、「選択するガベージ コレクタ」列に示されたガベージ コレクタを選択してください。3 番目の「動的なガベージ コレクタの場合」列は、サポートされている別のガベージ コレクタを示します。

表 3-2 ガベージ コレクタを選択するためのマトリックス

状況

選択するガベージ コレクタ

動的なガベージ コレクタの場合

  • 休止時間をできるだけ短くしたい。

  • アプリケーションのスループット (一部) と引き換えに休止時間を短くしたい。

  • メモリ容量の大きいシングル CPU マシンである。

  • アプリケーションのスループットをシングルスペース コンカレントの場合より高くしたい。

-Xgcprio:pausetime

-Xgc:singlecon

-Xgc:gencon

  • 4 つの CPU を搭載したマシン、またはメモリ容量の大きいシングル CPU マシンを使用している。

  • 長い休止時間が時々発生しても許容できる。

  • アプリケーションのスループットを最大限にする必要がある。

-Xgcprio:throughput

-Xgc:parallel

  • 動的なガベージ コレクタを使いたくない。

-Xgc:parallel

-Xgc:singlecon

 


ガベージ コレクションの動作の表示

ガベージ コレクションの動作を観察するには、以下のいずれかの方法を使用します。これを使用すると、選択したガベージ コレクタの効果を評価して、必要なチューニング方法を判断することができます。

 

ナビゲーション バーをスキップ  ページの先頭 前 次