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