この章では、JVMのメモリー占有領域を減らすために使用できるチューニング・オプションについて説明します。
メモリー・リソースが限られたシステムで実行している場合は、メモリーの占有領域が小さくなるようにOracle JRockit JVMをチューニングできます。
この章の内容は次のとおりです。
アプリケーションのメモリーの占有領域は、オペレーティング・システムに付属するツールの一部を使用して測定できます(上位のシェル・コマンドやWindowsのタスク・マネージャなど)。
JVMプロセスのメモリー使用量がどのように分散しているかを判別するには、jrcmd
コマンドを使用してメモリーの分析をリクエストし、JVMのメモリー使用量を出力します。詳細は、Oracle JRockit JDKツールを参照してください。
JVMのメモリー使用量に関する情報を取得したら、メモリーを最も使用する領域内でメモリーの占有領域を減らすために、JVMのチューニングを始めることができます。
メモリーの占有領域のチューニングを開始する場所として最も明白なのは、Javaヒープのサイズです。Javaヒープ・サイズを減らすと、Javaプロセスのメモリー占有領域も同じ量だけ減ります。ヒープ・サイズを無制限に減らすことはできません。ヒープには、同時に生存しているすべてのオブジェクトが入るサイズが必要です。。可能であれば、ヒープは最低でも生存しているオブジェクトの総量の2倍となるサイズか、またはJVMでJavaコードを実行する時間よりもヒープのガベージ・コレクションを実行する時間の方が少なくて済むサイズにする必要があります。
ヒープ・サイズを設定するには、-Xms
(初期ヒープ・サイズ)および-Xmx
(最大ヒープ・サイズ)のオプションを使用します。
例:
java -Xms:100m -Xmx:100m myApplication
システムの空きメモリーの量に応じてヒープを拡張および縮小できるようにするには、-Xms
コマンドを-Xmx
コマンドよりも低く設定します。ヒープ・サイズの設定の詳細は、4.4項「メモリー割当てのパフォーマンスの最適化」を参照してください。
ガベージ・コレクション・モードと静的な方式のどちらを選択するかによって、メモリーの占有領域が著しく影響を受けることは本質的にありませんが、適切なガベージ・コレクション方式を選択すると、パフォーマンスを大きく低下させずにヒープ・サイズを減らすことができます。
アプリケーションで多数の一時オブジェクトを使用している場合は、世代別のガベージ・コレクション方式の使用を検討してください。ナーサリによって断片化が減少するので、ヒープを小さくすることができます。
コンカレント・ガベージ・コレクタは、ヒープが完全に一杯になる前にガベージ・コレクションを開始して、Javaスレッドがガベージ・コレクション中にオブジェクトの割当てを続行できるようにする必要があります。つまり、コンカレント・ガベージ・コレクタにはパラレル・ガベージ・コレクタよりも大きなヒープが必要になります。したがって、メモリーの占有領域を小さくするための第1の選択肢はパラレル・ガベージ・コレクタになります。
デフォルトのガベージ・コレクション・モードは世代別パラレル・ガベージ・コレクション方式です。つまり、メモリーの占有領域を最小限に抑えるときは、デフォルトのガベージ・コレクタを選択するのが適切です。
ガベージ・コレクション・モードを変更するには、-Xgc
オプションを使用してモードを指定します。
例:
java -Xgc:genpar myApplication
ガベージ・コレクタの選択の詳細は、4.2項「ガベージ・コレクタの選択とチューニング」を参照してください。
小さなヒープを使用すると、ヒープの断片化が発生するリスクが高まります。ガベージ・コレクタがヒープ全体の圧縮を同時に行わざるを得なくなるときは、断片化がアプリケーションのパフォーマンスに重大な影響を与える可能性があります。スループットが低下し、さらにガベージ・コレクションがときどき長くなるという影響があります。
ヒープの断片化で問題が起こっている場合は、-XXcompaction:percentage
オプションを使用して圧縮率を上げることができます。
例:
java -XXcompaction:percentage=20 myApplication
長いレイテンシの影響を受けないアプリケーションの場合、完全な圧縮を使用することができます。完全な圧縮では、ガベージ・コレクションが実行されるたびに断片化はすべて解消されるため、小さなヒープを使用できるようになります。完全な圧縮を有効にするには、-XXcompaction:full
オプションを使用します。
例:
java -XXcompaction:full myApplication
圧縮では、ブックキーピングのためにヒープの外側のメモリーを使用します。圧縮を大きくするかわりに、世代別ガベージ・コレクタを使用しても断片化を緩和できます。
オブジェクトの割当てをチューニングして、割当てに使用される空きメモリーのチャンクを小さくすることができます。これにより、断片化による負の効果が軽減され、小さなヒープで実行できるようになります。オブジェクトの割当てに使用されるメモリーのうち、最も小さなチャンクは、スレッド・ローカル領域です。後続のガベージ・コレクションが隣接するメモリーを解放するか、大きな空きチャンクを作成するために領域を圧縮するまで、最小スレッド・ローカル領域サイズより小さな空きチャンクは、ガベージ・コレクタによって無視され、ダーク・マターとなります。
最小スレッド・ローカル領域サイズを削減するには、-XXtlaSize:min=
size
オプションを使用します。
例:
java -XXtlaSize:min=1k myApplication
スレッド・ローカル領域サイズの設定方法の詳細は、-XXtlaSize
のドキュメントと4.4項「メモリー割当てのパフォーマンスの最適化」を参照してください。