Sun Java System Application Server Enterprise Edition 8.2 パフォーマンスチューニングガイド

ガベージコレクタのチューニング

ガベージコレクション (GC) では、以前にオブジェクトに割り当てられ、現在は不要になったヒープスペースが再生されます。デッドオブジェクトを見つけて削除するプロセスによって、アプリケーションが停止状態になったり、25% ものスループットが消費されたりすることがあります。

ほとんどすべての Java 実行時環境には、世代別オブジェクトメモリーシステムと高性能の GC アルゴリズムが備わっています。世代別メモリーシステムでは、ヒープが、入念にサイジングされた「世代」と呼ばれる複数のパーティションに区切られます。世代別メモリーシステムの効率は、ほとんどのオブジェクトの生存期間が短いという観測に基づいています。それらのオブジェクトが蓄積されてメモリー不足の状態になると、GC が強制的に実行されます。

ヒープスペースは、古い世代と新しい世代に分けられます。新しい世代は、新しいオブジェクトの領域 (Eden) と、2 つの Survivor 領域で構成されます。JVM では、新しいオブジェクトは Eden 領域に割り当てられ、生存期間が長いオブジェクトは新しい世代から古い世代に移動されます。

若い世代では、Eden と 2 つの下位領域 (Survivor 領域) を用いる高速コピーガベージコレクタが使用され、生存しているオブジェクトが一方の Survivor 領域からもう一方の Survivor 領域にコピーされます。若い世代の領域で複数回のコレクションを経ても生存しているオブジェクトは、永続化されます。つまり寿命の長い (tenured) 世代にコピーされます。寿命の長い (tenured) 世代はサイズが大きいため、すぐにいっぱいになることはありません。そのため、ガベージコレクションはそれほど頻繁に行われませんが、1 回のコレクションにかかる時間は若い世代の領域のみのコレクションよりも長くなります。寿命の長い (tenured) 世代の領域のコレクションは、全世代のコレクションとも呼ばれます。

頻繁に行われる若い世代の領域のガベージコレクションは短時間 (数ミリ秒) ですが、全世代のコレクションはもっと時間がかかります (ヒープサイズに応じて数 10 ミリ秒から数秒)。

CMS (Concurrent Mark Sweep ) など、その他の GC アルゴリズムは増分的で、フル GC はいくつかの増分区分に分けられます。このため、短時間の中断が生じる可能性が高くなります。このプロセスは、オーバーヘッドを伴うため、企業向けの Web アプリケーションでは使用されません。

新しい世代がいっぱいになると、生存しているオブジェクトを古い世代に移動するマイナーコレクションがトリガーされます。古い世代がいっぱいになると、オブジェクトヒープ全体を対象とするメジャーコレクションがトリガーされます。

HotSpot と Solaris JDK はどちらも、スレッドローカルなオブジェクト割り当てプールを使用して、ロックされない高速でスケーラブルなオブジェクト割り当てを行います。そのため、ほとんどの場合、カスタムオブジェクトプールは必要ありません。オブジェクト構築コストが高く、実行プロファイルに大きく影響する場合にのみ、プールを検討します。

ガベージコレクションアルゴリズムの選択

フル GC 中の中断時間が 4 秒を超えると、HADB でのセッションデータの持続に断続的に失敗する可能性があります。

GC が進行している間、Application Server は動作していません。中断が長すぎると、HADB で既存の接続がタイムアウトになります。その後、アプリケーションサーバーが動作を再開したときに、それらの接続を使用してセッションデータを持続しようとすると、HADB によるエラーが生成されます。生成されるエラーは、「セッションデータの保存に失敗しました」、「トランザクションが中止されました」、「HADB サーバーへの接続に失敗しました」などです。

この問題が発生しないようにするには、GC アルゴリズムとして CMS コレクタを使用します。このコレクタはほとんど絶え間なく実行されているので、使用率の高いシステムではスループットが低下する可能性があります。ただし、ガベージコレクタが低頻度で実行される場合に生じる可能性がある長い中断は回避できます。

ProcedureCMS コレクタを使用する

  1. システムの CPU 使用率が 100% ではないことを確認します。

  2. 管理ガイドの説明に従って、HADB タイムアウトを設定します。

  3. サーバーインスタンスで CMS コレクタを設定します。

    これを行うには、次の JVM オプションを追加します。

    • -XX:+UseConcMarkSweepGC

    • -XX:SoftRefLRUPolicyMSPerMB=1

補足情報

HotSpot ガベージコレクションを監視するには、jvmstat ユーティリティーを使用します。「詳細情報」を参照してください。

ガベージコレクタのチューニングの詳細については、『Tuning Garbage Collection with the 5.0 Java Virtual Machine』を参照してください。