このページでは、Java アプリケーションのガベージコレクションをモニタする方法について説明します。

AppDynamics では、ガベージ コレクション メトリックが収集され、定期的なガベージコレクションによってアプリケーションのパフォーマンスがどのような影響を受けるのかを分析できます。重要な点は、過剰なガベージコレクションやメモリが原因で不安定になることによるアプリケーションへの影響を特定することです。Java 仮想マシン(JVM)上で実行されている一般的な Java アプリケーションでは、プリミティブの文字列、ファイル、配列などのオブジェクトがヒープ上に作成されます。Java ガベージコレクションは、アプリケーションで使用されなくなったオブジェクトを見つけて削除する自動メモリ管理プロセスです。

JVM では、使用可能なメモリ量を最大限にするためにガベージコレクションが定期的に実行されるため、プログラマはオブジェクトに削除対象のマークを明示的に付ける必要がありません。ガベージコレクションは、ストップザワールドによって、すべてのアプリケーションスレッドを一時停止する必要があります。このプロセスによって、特に大量のデータ、複数のスレッド、および高いトランザクション率を持つアプリケーションのパフォーマンスが影響を受けます。

世代別ガベージコレクションの動作を確認するには、「Java メモリを習得する方法」を参照してください。 

はじめに

JDK バージョン 1.6.0_26-b03 でアプリケーションが実行され、G1GC を使用するようにモニタリング対象のアプリケーションが構成されている場合は、Java エージェントでメモリ統計をキャプチャできません。メモリ統計をキャプチャするには、次のいずれかを実行します。

  • アプリケーション起動オプションから G1GC(-XX:+UseG1GC)を削除します。または、
  • JDK を 1.6.0_32 以降にアップグレードします。

JVM 1.7 以降では、ガベージ コレクション メトリックを生成するために、エージェントで Java イベント通知サービスにリスナーが追加されます。1.7 よりも前の JVM では、メトリックを生成するために、エージェントで特定の JVM ログファイルが解析されます。そのため、JVM で必要なログが生成されていることを確認する必要があります。「ログベースのガベージコレクションの有効化」を参照してください。

ガベージコレクションのモニタリング

Java エージェントでは、特定のガベージ コレクション メトリックが 1 分間の間隔でレポートされます。これらのメトリックは、ノードダッシュボードのMemoryタブのHeap & Garbage Collectionサブタブに表示できます。

  • Heap utilization:空き、使用済み、コミット済み、利用可能。
    ここには、メモリの使用が最も大まかに表示されます。
  • Garbage Collection:1 つのタイムラインのマイナー、メジャー、合計。
    これは、メジャーコレクションに対するマイナーコレクションの比率の概念を示している必要があります。
  • タイムラインに表示されるMinor Garbage Collection
  • タイムラインに表示されるMajor Garbage Collection
  • Memory pool use(すべてのメモリ領域:若い世代、古い世代、永続的な世代の使用を含む)。

アプリケーションのパフォーマンスへのガベージコレクションの影響をより詳細に表示するために、メトリックブラウザでガベージ コレクション メトリックを表示できます。 Application Infrastructure Performance > tier > JVM > Garbage Collection に移動します。

メトリックブラウザには、定期的に収集されたメトリックに加えて、マイナーまたはメジャー ガベージ コレクション イベントでトリガーされた次のメトリックも表示されます。

メトリックトリガーイベント説明

割り当てられたオブジェクト

マイナーコレクション

若い世代に割り当てられたメモリ

高い増加率は、メモリスラッシングが発生していることを示している可能性があります。割り当て率はマイナーコレクションイベントの頻度に影響するため、長期間にわたってアプリケーションのパフォーマンスが影響を受ける可能性があります。

[Count ] の値は、作成されたコレクションの数を示します。

格上げされたオブジェクトメジャーコレクション

若い世代の領域から古い世代の領域に格上げされたオブジェクトで使用中のメモリ量

高い格上げ率は、メジャーコレクションイベントに関連します。これによって、完全なメジャーコレクションサイクルの期間が原因でアプリケーションのパフォーマンスが大きな影響を受ける可能性があります。

格上げ率が割り当て率に近い場合は、格上げが時期尚早であることを示している可能性があります。この場合、若い世代の領域により多くのメモリを割り当てることをお勧めします。

[Count ] の値は、作成されたコレクションの数を示します。

解放されたオブジェクト

マイナーまたはメジャーコレクション

若い世代の領域と古い世代の領域で再利用されるオブジェクトで使用中のメモリ量。

通常のシステムでは、オブジェクトの割り当て率と解放率メトリックの数をほぼ等しくする必要があります。

[Count ] の値は、作成されたコレクションの数を示します。

LiveDataメジャーコレクション

メジャー ガベージ コレクション後も存続する使用中のメモリ量。

ライブデータサイズの上昇は、メモリリークが発生している可能性があることを示しています。

JVMでのガベージコレクションの調整

ガベージコレクションの診断メトリックを確認したら、次の JVM 引数を使用して、JVM ガベージコレクションのメモリプールで領域の割り当てを調整できます。たとえば、長期間に多数のオブジェクトがアプリケーションに格納される必要がある場合に、古い世代の領域のサイズを増加することがあります。

JVM の引数意味

-Xms

若い世代の領域と古い世代の領域に割り当てられた合計メモリ量。

-XX:NewSize

若い世代の領域に割り当てられたメモリ量。

-XX:PermSize

パーマネントジェネレーションに割り当てられたメモリ量。


ログベースのガベージコレクションの有効化

1.7 よりも前の JVM で実行されているアプリケーションでは、特定のガベージコレクションログの定期的な解析に基づいてガベージコレクションがモニタリングされます。 

アプリケーションのガベージコレクションログを設定するには、次の引数を使用します。

-Xloggc:log-file-path 
-XX:+Usecollector-type 
-XX:+PrintGCDetails

log-file-path オプションでは、ログファイルを配置する場所が指定されます。以下の表では、-XX:+Usecollector-type オプションに指定できるコレクタタイプの値について説明します。

コレクタタイプ効果

CMSコレクタ

-XX:+UseConcMarkSweepGC

低停止時間が必須であり、リソースをガベージコレクタと共有できるアプリケーションに適しています。

使用するスレッドの数を設定するには、-XX:ParallelCMSThreads=<n> を使用します。

スループットまたはパラレルコレクタ

-XX:+UseParallelGC
-XX:+UseParallelOldGC

複数の CPU を使用すると、アプリケーションのスループットを向上させることができます。長い停止時間を受け入れることができる作業集約型アプリでの使用に適しています。

G1コレクタ

 -XX:+UseG1GC

Java 7で使用でき、CMSコレクタの長期的な代替となるように設計されています。これは、並列的、同時的、増分的に小型化する低停止時間コレクタです。


ログに記録された情報を表示するようにコントローラに指示するには、コントローラ UI で次のノードプロパティを登録します。

enable-jmx-visibility=true
enable-log-based-gc=visiblity=true

デフォルトのログチェック間隔を変更するには、次のノードプロパティを登録します。

logbased-visibility-log-check-interval-in-mills=1000

ガベージコレクションログを解析する正規表現の指定

ログベースのガベージ コレクション メトリックを有効にすると、エージェントでは、さまざまな JDK タイプとガベージコレクションタイプの組み合わせに対応するためにビルトイン正規表現が使用されます。ビルトイン正規表現からシステムのガベージ コレクション メトリックが返されない場合は、次のノードプロパティを登録してログを解析するカスタム正規表現を指定できます。

  • young-gc-custom-regex-1
  • young-gc-custom-regex-2
  • young-gc-custom-regex-3
  • full-gc-custom-regex-1
  • full-gc-custom-regex-2
  • full-gc-custom-regex-3

ノードプロパティを使用してカスタム正規表現を設定すると、ビルトイン正規表現のいずれかを使用してログを解析できなくなります。