JRockit SDK ユーザーズ ガイド
![]() |
![]() |
![]() |
![]() |
メモリ管理は効果的な「ガベージ コレクション」に依存しています。ガベージ コレクションとは、ヒープから不要になったオブジェクトを消去して、その領域を新しいオブジェクトのために解放するプロセスです。メモリ管理を効率的に行うと、効率的な処理が実現されます。BEA JRockit の統合ガベージ コレクタでは、メモリ スループット、またはコレクションに起因する休止時間のどちらか 1 つの優先順位に基づいて機能する動的なガベージ コレクタを選択できます。統合ガベージ コレクタは、実行中に、あらかじめ定義されたヒューリスティックに基づいて、使用するコレクション アルゴリズムを決定し、個々のケースの状況に応じてそのアルゴリズムを変更するという点で「動的」です。このガベージ コレクタを実行するための実際のアルゴリズムを指定する必要はありません。
場合によっては、動的なガベージ コレクションが、メモリを解放する最も効率的な方法にならないこともあります。そのような場合に備えて、BEA JRockit には「静的な」コレクタも数多く用意されています。静的なコレクタを使用するには、起動時に実際のコレクタを指定します (-Xgc:<
collectorName
>
)。または、起動時に選択した JVM モードによって決定されるデフォルトのコレクタを使用します。
この節では、これらのガベージ コレクション方式の使い方について説明します。内容は以下のとおりです。
統合ガベージ コレクタは、世代別としてもシングルスペースとしても (つまり、「ナーサリ」の有無にかかわらず) 動作する「マークアンドスイープ」コレクタです (後述の「世代別」を参照)。どちらのマークアンドスイープ オプションでも、コンカレント アルゴリズムまたはパラレル アルゴリズムを実装できます。ガベージ コレクションのオプションとアルゴリズムの詳細については、「ガベージ コレクタの組み合わせ」を参照してください。
マークアンドスイープ コレクタは 3 つのパスから成るモデルで、参照されていないすべてのオブジェクトを解放します。次の手順のように動作します。
統合ガベージ コレクタは、以下の 2 つのガベージ コレクタ オプションと、
以下の 2 つのガベージ コレクション アルゴリズムのさまざまな組み合わせ (または「ステート」) で構成されます。
世代別ガベージ コレクションでは、ヒープは古い世代と若い世代 (「ナーサリ」とも呼ばれる) の 2 つのセクションに分かれています。オブジェクトがナーサリに割り当てられて、ナーサリが一杯になると、JVM は処理を停止して (つまり、すべてのスレッドを停止して)、生存しているオブジェクトを若い世代から古い世代に移動します。同時に、古いコレクタ スレッドが背後で動作しており、古い世代でオブジェクトを生存中としてマークし、不要になったオブジェクトは削除して、JVM に空いた領域を返します。
ガベージ コレクションのシングルスペース オプションの場合、すべてのオブジェクトは、経過時間に関係なく、ヒープ上の 1 つの領域内で生存期間を過ごします。つまり、シングルスペース ガベージ コレクタにはナーサリはありません。
コンカレント ガベージ コレクション アルゴリズムでは、他のすべての処理と「コンカレント」(同時) に、マークとスイープを行います。つまり、Java スレッドを停止しないでガベージ コレクションを完了します。
パラレル ガベージ コレクション アルゴリズムでは、ヒープが一杯になったときに Java スレッドを停止し、すべての CPU を使用して、ヒープ全体のマークとスイープを完了します。パラレル コレクタはコンカレント コレクタよりも休止時間が長くなりますが、スループットを最大にします。このようにパフォーマンスが最大になるため、アプリケーションで長い休止時間を許容できる場合は、シングル CPU マシン上でもパラレル ガベージ コレクタをお勧めします。
統合ガベージ コレクタは、マークアンドスイープ モデルの中で、前述のオプションとアルゴリズムを組み合わせてコレクションを実行します。コレクタは、使用するヒューリスティックに応じて、コンカレントまたはパラレルのマーク フェーズと、コンカレントまたはパラレルのスイープ フェーズにおいて、世代別 コレクタまたはシングルスペース コレクタを採用します。
動的な (「最適化」) ガベージ コレクタの主な利点は、要件に最も適したコレクタを実行するために、ユーザ側では、コレクション中の最適なメモリ スループットと最小の休止時間のどちらの方がアプリケーションにとって効果的なのかを決定するだけでよい点です。自分のアプリケーションの動作を理解しているだけでよく、ガベージ コレクション アルゴリズムやさまざまな組み合わせについて理解する必要はありません。
注意 : -Xgcprio
は BEA JRockit 1.4.2_08 以前のリリースではサポートされていません。このオプションがサポートされているのは 1.4.2_10 以降のリリースのみです。
統合ガベージ コレクタを起動するには、-Xgcprio
コマンドライン オプションに throughput
パラメータまたは pausetime
パラメータを指定します。どちらを指定するかは、使用する優先順位によって異なります。
-Xgcprio:<throughput|pausetime>
表 3-1 では、動的なガベージ コレクタを起動する際の優先順位と、その優先順位の選択に使用するパラメータを示します。
優先順位を選択して JVM を起動すると、動的なガベージ コレクタは優先順位に基づいてパフォーマンスを最適化するガベージ コレクション ステートを選択します。-Xgcprio:throughput
を指定すると、スループットが最適化されるモードが選択され、-Xgcprio:pausetime
を指定すると、休止時間が可能な限り短くなるモードが選択されます。
状況によっては、動的なガベージ コレクタを使用しない方がよい場合もあります。そのような場合は、デフォルトで起動される静的なコレクタを使用するか、BEA JRockit の以前のバージョンに用意されていた下位互換性のあるガベージ コレクタの 1 つを使用することができます。-Xgcprio
を指定して起動する動的なガベージ コレクタとは違って、静的なコレクタでは、最初に選択されたガベージ コレクション アルゴリズムを変更できません。アルゴリズムの変更によるパフォーマンスの最適化は行われません。
BEA JRockit SDK の以前のバージョンに用意されていた 3 種類のガベージ コレクタは、このバージョンでも使用できます。場合によっては、これらのコレクタのパフォーマンスの方が、統合ガベージ コレクタまたは -server
フラグまたは -client
フラグを設定したデフォルトのコレクタよりニーズに適していることがあります。また、JRockit の以前のバージョン用に記述したスクリプトがあり、その中でこれらのコレクタを実装している場合、そのスクリプトは一切修正することなく引き続き使用できます。ただし、スクリプトで世代別コピー ガベージ コレクタを使用している場合は除きます (このガベージ コレクタは使用できなくなりました)。当然ですが、スクリプトを変更して統合ガベージ コレクタを実装することはできます。
使用できるガベージ コレクタ (と起動するコマンド) は次のとおりです。
-Xgc:singlecon
、BEA JRockit が -client
モードで動作しているときのデフォルトのガベージ コレクタ)-Xgc:gencon
)-Xgc:parallel
、BEA JRockit が -server
モードで動作しているときのデフォルトのガベージ コレクタ)表 3-2 に、各ガベージ コレクタの長所と短所を示します。
表 3-3 は、ユーザの BEA JRockit JVM 実装に適したガベージ コレクタを決定するために使用できるマトリックスです。「状況」列で実装に合う状況を見つけて、「選択するガベージ コレクタ」列に示されたガベージ コレクタを選択してください。3 番目の列には、サポートされない (静的な) ガベージ コレクタにのほかに、ニーズに適したサポートされる (動的な) ガベージ コレクタを示します。
起動時に -Xgcprio
または -Xgc
を設定しない場合は、JVM モードとしてサーバサイド (-server
、デフォルトのモード) とクライアントサイド (-client
) のどちらを選択したかに基づいて、静的なガベージ コレクタがデフォルトのコレクタになります。これらはガベージ コレクタそのものを指定するオプションではありません。静的なコレクタを起動し、デフォルトの初期ヒープ サイズおよび最大ヒープ サイズを設定する JVM コンフィグレーション オプションです。表 3-4 は、これらの起動オプションを使ってガベージ コレクタを設定する方法を示しています。
|
|
|
-server
オプションと -client
オプションの使い方の詳細については、「BEA JRockit JVM の起動とコンフィグレーション」を参照してください。
-Xgcprio
を設定すると、 -server
と -client
に関連するすべての設定がオーバーライドされます。-Xgc
を設定すると、-Xgcprio
、 -server
、および -client
がオーバーライドされます。
ガベージ コレクションのアクティビティを観察するには、以下のいずれかのオプションを使用します。これらのオプションを使用すると、選択したガベージ コレクタの効果を評価して、必要なチューニング方法を判断することができます。
-Xgcreport
を入力します。このオプションを指定すると、BEA JRockit JVM は、プログラムのコンパイル時にガベージ コレクションの包括的なレポートを出力します。 -Xgcpause
オプションを入力します。このオプションを指定すると、Java スレッドがガベージ コレクションのために停止されるたびに VM から 1 行ずつ出力されるようになります。この 2 つのオプションを組み合わせると、アプリケーションのメモリの動作をよく調べることができます。
-java -Xgcreport -Xgcpause myClass
スレッドローカル割り当ては、オブジェクト割り当ての競合を取り除き、ヒープでメモリの割り当てを行うスレッド同士を同期する必要性を軽減します。また、異なる CPU 上で動作する 2 つのスレッドが同じメモリ ページに同時にアクセスするリスクが減るため、マルチ CPU システムでキャッシュのパフォーマンスが向上します。
スレッドローカル割り当てはスレッドローカル オブジェクトと同じではありませんが、2 つの用語は混同されやすくなっています。スレッドローカル割り当ては、オブジェクトが 1 つのスレッドからのみアクセスされる (つまり、スレッドローカル オブジェクトである) かどうかを決定するものではありません。スレッドローカル割り当てとは、他のスレッドが新しいオブジェクトを作成できない独自の領域をスレッドに持たせることを意味します。ただし、スレッドがその領域に作成するオブジェクトには、他のスレッドからもアクセスできます。
![]() ![]() |
![]() |
![]() |