このページでは、Java のカスタムメモリ構造をモニタする方法について説明します。 

AppDynamics は自動リーク検出で、長期の Java コレクション(HashMap、ArrayList など)を自動的に追跡します。特定のクラスを追跡するには、コントローラ UI でカスタムメモリ構造機能を使用できます。

この機能を使って、カスタムキャッシュまたはJavaコレクションではないその他の構造をモニタリングすることができます。たとえば、カスタムキャッシュや Ehcache などのサードパーティのキャッシュがある場合があります。分散環境では、キャッシングがメモリリークの主な原因になりやすい傾向があります。また、カスタムメモリ構造には、自動リーク検出を使って追跡されるコレクションオブジェクトが含まれる場合と含まれない場合があります。 

Javaエージェントでカスタムメモリ構造をモニタリングすると、CPU使用量が増加する可能性があります。AppDynamicsでは、トラブルシューティング中のみの短期間または実稼働前の環境でメモリ構造のモニタリングを有効にすることが推奨されます。

カスタムメモリ構造を構成する場合は、カスタムメモリ構造がお使いの JVM 環境でサポートされていることを確認してください。「JVM のサポート」を参照してください。

  • オブジェクトインスタンスの追跡を有効化または無効化するには、Configure Agent Properties 権限が必要です。
  • 追跡するカスタムクラスを構成するには、メモリモニタリングの構成権限が必要です。詳細については、カスタムロールの作成と管理を参照してください。

カスタムメモリ構造とメモリリーク

通常、カスタムメモリ構造はキャッシングソリューションとして使用されます。分散環境では、キャッシングがメモリリークの原因になりやすい傾向があります。AppDynamicsは、こうしたメモリ構造のメモリ統計を管理および追跡するのに役立ちます。

AppDynamicsは以下の可視情報を提供します。

  • 遅延、過剰遅延および停滞したビジネストランザクションのキャッシュアクセス。
  • ビジネス トランザクション レベルにロールアップされる使用統計。
  • アクセスされているキー。
  • 内部キャッシュ構造のディープサイズ。

自動リーク検出とカスタムメモリ構造のモニタリング

自動リーク検知は、JVMセッション内のすべてのマップおよびコレクションライブラリのメモリ使用データを取得します。ただし、カスタムメモリ構造にすべてのコレクションオブジェクトが含まれているとは限りません。たとえば、メモリ使用量の統計情報を収集するEhcacheなどのサードパーティ製のキャッシュやカスタムキャッシュがある場合もあります。

カスタムメモリ構造を使用すると、アプリによって作成されたカスタムオブジェクトをモニタリングでき、サイズデータは JVM の再起動時にトレースできます。自動リーク検知は通常、リークを識別するために使用され、カスタムメモリ構造は、大まかで粗いカスタム キャッシュ オブジェクトをモニタリングするために使用されます。

カスタムメモリ構造の構成、モニタリング、トラブルシューティングのワークフローを以下に説明します。カスタムメモリ構造は手動で構成する必要があります。

  1. Tiers & Nodesのダッシュボードで、Automatic Leak Detection, On Demand Capture Session機能を使って、モニタリングされないクラスを決定します(例:カスタムキャッシュや、EhCache などのサードパーティのキャッシュ)。
  2. Custom Memory Structuresを構成し、必要に応じて JVM を再起動します。 
  3. [Create New Instance Tracker] ウィンドウで完全修飾クラス名を入力し、[Save] をクリックします。
    AppDynamics は自動リーク検出で、長期の Java コレクション(HashMap、ArrayList など)を自動的に追跡します。
  4. Custom Memory Structures のモニタリングをオンにして、構成したカスタムメモリ構造の潜在的なメモリリークを検出します。
  5. リークしているメモリ構造をドリルダウンして詳細を確認し、リーク元の特定に役立てる。

カスタムメモリ構造を識別するには:

  1. [Memory] > [Automatic Leak Detection] に移動して、[On] をクリックします。
  2. [Start On Demand Capture Session] をクリックして、どのクラスがどのコレクションオブジェクトにアクセスしているかの情報を取得。この情報を使用してカスタムメモリ構造を識別。

AppDynamicsでは、インスタンスカウントで上位1000のクラスが取得されます。

メモリリークの可能性の識別

カスタムメモリ構造のメモリ使用パターンのモニタリングを始めます。急激に増加に傾いている場合、オブジェクトは自動的にリークの可能性があるオブジェクトとしてマークされます。Memory Leakダッシュボードに表示される情報は次のとおりです。

  • Heap & Garbage Collection:ヒープおよびガベージコレクションのメトリックを提供します。
  • Automatic Leak Detection:JVM セッション内のすべてのマップおよびコレクションライブラリのメモリ使用データを提供します。
  • Object Instance Tracking:ヒープ内の上位 20 個のアプリケーションおよび上位 20 個のシステム(コア Java)クラスのトラッキングデータを提供します。
  • Custom Memory Structures:特定のクラスを追跡し、Java コレクションではないカスタムキャッシュまたはその他の構造をモニタできます。

Custom Memory Structuresダッシュボードに表示される情報は次のとおりです。

    • Class:モニタリングされているクラスまたはコレクションの名前。
    • Deep Size (bytes):構造に対して使用できるメモリの上限。ディープサイズはJVMの再起動の前後をまたいでトレースされる
    • % of Current Used Heap:動的割り当てに使用できるメモリの割合。
    • Potentially Leaking:リークの可能性があるコレクションは赤でマークされる。リークの可能性があるオブジェクトに対して診断セッションを開始することが推奨される。 
    • JVM Start Time:カスタムメモリ構造は JVM の再起動の前後をまたいで追跡される。 
    • Status:診断セッションがオブジェクトで開始された場合に示される。
    • Deep Size:急激に増加に傾いている場合はメモリリークの可能性がある。

リークの可能性があるコレクションが識別されたら、診断セッションを開始します。

メモリリークの診断

Custom Memory Structuresのダッシュボードで、モニタするクラス名を選択し、[Drill Down.] をクリックします。

リークしているコレクションの分離

コレクションがアプリケーションのどの部分に属しているかを特定するには、Content Inspectionを使用します。これにより、特定のメモリ構造の全エレメントのヒストグラムをモニタリングできます。オブジェクトに対して診断セッションを開始し、それから以下の手順に従います。

  1. Content Inspectionタブを選択。
  2. [Start Content Summary Capture Session] をクリック。
  3. セッション期間を入力。データ生成に少なくとも1-2分を割り当てる。
  4. [Refresh] をクリックし、セッションデータを取得する。
  5. スナップショットをクリックして特定のコンテンツサマリキャプチャセッションに関する詳細を表示。

アクセストラッキング

Access Trackingを使用して、メモリ構造にアクセスする実際のコードパスとビジネストランザクションを表示します。オブジェクトに対して診断セッションを開始し、それから以下の手順に従います。

  1. Access Trackingタブを選択。
  2. [Start Access Tracking Session] を選択する。
  3. セッション期間を入力。データ生成に少なくとも1-2分を割り当てる。
  4. [Refresh] をクリックし、セッションデータを取得する。
  5. スナップショットをクリックして特定のコンテンツサマリキャプチャセッションに関する詳細を表示。