メモリリーク検知

Site24x7 APMのメモリリーク検知でアプリケーションパフォーマンスに重大な影響を及ぼす前に検知し対処します。

目次

メモリリークとは

アプリケーションでメモリリークが発生するのは、メモリリソースが割り当てられていても、不要になったときに適切に解放されない場合です。これは不適切なコーディングにより頻繁に発生します。

メモリを開放することなく、アプリケーションが追加のメモリを使用するとサーバーのメモリが不足します。サーバーメモリが使用されると、アプリケーションクラッシュを引き起こします。

Javaではガベージコレクション時にリソースに割り当てられたメモリが解放され、アプリケーションのメモリリークが発生します。

メモリリーク検知タブのオンデマンドメモリプロファイリング機能で、コレクションを追跡し、線形回帰モデルで潜在的なリークを特定します。収集したオブジェクトの増加を追跡し、リークの根本原因を特定します。

オンデマンドメモリプロファイリング

オンデマンドメモリプロファイリングを用いて、多くのメモリを消費しているコードスタックのクラスを特定できます。選択した期間で収集されたすべてのオブジェクトとその関連するメトリックが表示されます。

オンデマンドメモリプロファイリングの開始方法は次のとおりです。

  1. Site24x7にログインします。
  2. APM > Javaアプリケーションに移動します。
  3. JVMタブをクリックし、その配下のメモリリーク検知タブをクリックします。
  4. メモリプロファイリング開始ボタンをクリックし、メモリプロファイリングを開始します。
    1日に各インスタンスで、10回のオンデマンドメモリプロファイリングを実行できます。

    On-Demand Memory Profiling

  5. 表示されたパラメーターを変更して、プロファイリングをカスタマイズします。

    Change the listed parameters

    • プロファイリング期間:オブジェクトを収集する期間を5から30分の間で選択します。
    • オブジェクト経過:取得したオブジェクトの経過時間を1から9分の間で設定します。
      例:プロファイリング期間を20に設定している場合、20の30%は6のため、1から6分で経過を設定できます。
      経過の最大値はプロファイリング期間の値の30%です。
      例:プロファイリング期間を20に設定している場合、20の30%は6のため、1から6分で経過を設定できます。
    • インスタンス:アプリケーションとインスタンスの両方で、オンデマンドメモリプロファイリングを開始できます。
      • アプリケーションビューでは、プロファイリングを開始したいインスタンスを複数選択できます。
      • インスタンスビューでは、デフォルトで特定のインスタンスのみ選択でき、インスタンスドロップダウンは無効化されます。
  6. 開始をクリックして、メモリプロファイリングを開始します。
オンデマンドメモリプロファイリングが開始されると、メモリプロファイリング開始ボタンが、プロファイリング開始済みボタンとなり無効化されます。

Disabled Memory Profiling

メモリプロファイリング開始ボタンが無効化されるケースは次のとおりです。

  • 監視ステータスがダウンまたは停止状態のとき
  • Javaエージェントバージョンが5.8未満の時
  • メモリリークプロファイリングが実行中の時

オンデマンドメモリプロファイリングが完了すると、取得データがメモリリーク検知タブに表示されます。次のビューで取得メトリックが表示されます。

テーブルビュー

テーブルビューでは、プロファイリング中に収集したオブジェクトとその関連メトリックを表示します。

各メモリオブジェクトをクリックすると、その詳細ビューが表示されます。

Table view of memory leak detection

パラメーター 説明
クラス名 メモリオブジェクトが含まれるクラスの名前です。
エレメント数 メモリオブジェクトに保存されているエレメント数です。
オブジェクトリークステータス オブジェクトがメモリリークしているかを次のマークで判別します。
  • 緑チェックマークはメモリリークが起こっていないことを示します。
  • 赤マークはメモリリークが検知されたことを示します。
オブジェクト作成時間 オブジェクトが取得された時間です。
インスタンス名 インスタンスの名前です。

直近のメモリイベント項目で、メモリオブジェクトに関連付いているメモリリークイベントと、発生した時間が表示されます。これにより、トラブルシュートの効率を上げ、同様のメモリリーク問題を防ぎます。

  • 直近の25メモリリークイベントのみ表示されます。
  • メモリオブジェクトに関連付いているイベントサマリーをクリックすると、その詳細ビューを表示できます。

詳細ビュー

詳細ビューで、左パネルに表示されている各クラスをクリックすることで、メモリリークに関する追加情報を表示できます。

Details view of memory leak detection

パラメーター 説明
クラス名 メモリオブジェクトを含んだクラスの名前です。
エレメント数 メモリオブジェクトに保存されているエレメント数です。

各クラスをクリックして関連するメトリックを表示します。メトリックは3つのタブで分けられています。

概要

画面上部に、オブジェクトのメモリリークステータス、エレメント数、オブジェクトサイズが表示されます。

オブジェクトの更新サイズを表示するには、コンテンツ検査またはアクセス追跡を有効にする必要があります。

Overview tab of memory leak detection

エレメント数は、すべての時間での変更を95パーセンタイルで、エレメント数のグラフとして表示します。

直近のメモリイベントは、選択したクラスと関係するメモリイベントのサマリーとそのイベントの発生した時間を表示します。

コンテンツ検査

コンテンツ検査が行われると、エージェントが選択したクラスのオブジェクトサイズを監視します。毎分(ユーザーが指定した時間幅内)オブジェクトサイスが変更している場合、毎分にエージェントがデータを取得し画面に表示します。そのため、毎分に更新されるデータをコンテンツ検査タブで取得できます。

コンテンツ検査の開始方法:

  1. 左パネルからクラスを選択し、オブジェクトコンテンツ検査クリックして、オンデマンドユーザーアクションのダイアログボックスを表示します。
    メモリリークが発生している場合、エージェントが自動的にコンテンツ検査プロセスを実施します。
  2. 検査期間を5から30分の間で選択します。
  3. 開始をクリックして、コンテンツ検査を開始します。

プロファイリングが完了すると、タイムスタンプと各メトリックが表示されます。

Content inspection metrics

パラメーター 説明
時間 メモリオブジェクトが取得された時間です。
クラス 取得されたメモリオブジェクトです。
メモリオブジェクトに保存されているエレメント数です。
サイズ メモリオブジェクトのサイズです。
  • タイムスタンプは中間のパネルに表示されます。各タイムスタンプをクリックすると、その時間に取得されたオブジェクトとメトリックが右側パネルに表示されます。
  • 選択したオブジェクト(クラス名配下)のサイズに変更がない場合、最初の時間(分)のデータのみ表示されます。

アクセス追跡

アクセス追跡が行われると、エージェントが選択したクラス内のオブジェクトを監視します。オブジェクトにコードパスを経由したアクセスがあると、エージェントがそのコードパスを取得します。追跡が完了すると、取得メトリックが画面に表示されます。

アクセス追跡の開始方法:

  1. 左パネルよりクラスを選択しオブジェクトトレースの取得をクリックすると、オンデマンドユーザーアクションダイアログボックスが表示されます。
    メモリリークが発生している場合、アクセス追跡プロセスは自動で実施されます。
  2. 追跡期間を5から30分の間で選択します。
  3. 開始をクリックして、アクセス追跡を開始します。

    Initiate access tracking

追跡が完了すると、アクセス追跡タブにそのメトリックを表示します。

Access tracking metrics

セッションごとに25オブジェクトのみ取得します。
パラメーター 説明
時間 コードパスが取得された時価です。
コードパス メモリオブジェクトが発見されたトレースです。
発生数 同じトレースが収集された回数です。

オブジェクトが取得された際にタイムスタンプのリストが中間パネルに表示されます。タイムスタンプをクリックすると、その時間で取得されたコードパスが→パネルに表示されます。

  • 同じコードパス経由で同じオブジェクトにアクセスがあっても、タイムスタンプは新規追加されません。しかし、発生数項目の値が増加します。
  • クラス名配下で選択したオブジェクトにアクセスがない場合、データは表示されません。

    No access tracking data

ユースケース

Javaアプリケーションが、コード内の論理エラーが原因で不要になったオブジェクト参照 (静的として宣言されたもの) を意図せずに保持している状況を考えます。これらの意図しないオブジェクト参照により、組み込みのガベージコレクションは、これらオブジェクトが消費するメモリを解放できなくなります。コレクションオブジェクトは継続的に増加し、アプリケーションの有効期間をでメモリ内に残るため、重要なメモリを他の場所で使用することができなくなります。

APMエージェントはどのようにオブジェクトがリークしているかを判別するか

Javaのオブジェクト収集の取得に、Site24x7は次の条件をもちます。
・メモリリークが発生した際に、ユーザーはオブジェクトの経過時間を指定する必要があります。
・コレクションまたはマップのエレメント数が1000を超えている必要があります。
・オブジェクトのサイズが5MBを超えている必要があります。

Javaエージェントはコレクションオブジェクトを取得し、線形回帰モデルを使用して潜在的なリークを確認します。長期間の増加が検知されるとSite24x7コレクションオブジェクトのサイズを監視します。潜在的な増加はコレクションオブジェクトが、潜在的なリークオブジェクトであるか、メモリリークの発生源であることを示します。

オブジェクトがリークしている可能性がある場合は、次の手順を実行してください。

  • コンテンツ検査
    コンテンツ検査で、アプリケーション内に保持されているデータコレクションを把握し、トラブルシュートに役立てられます。これにより、特定のコレクション内にあるエレメントのヒストグラムを表示できます。
  • アクセス追跡
    アクセス追跡で、コレクションオブジェクトにアクセスした実際のコードパスを表示します。

リーク防止のためのベストプラクティス

・必要のない場所での静的なコレクションオブジェクトを無効にします。
・正確なコレクションとマップを選択します。
・ひし形演算子とジェネリック型を使用します

トップ