Site24x7 APMのメモリリーク検知でアプリケーションパフォーマンスに重大な影響を及ぼす前に検知し対処します。
アプリケーションでメモリリークが発生するのは、メモリリソースが割り当てられていても、不要になったときに適切に解放されない場合です。これは不適切なコーディングにより頻繁に発生します。
メモリを開放することなく、アプリケーションが追加のメモリを使用するとサーバーのメモリが不足します。サーバーメモリが使用されると、アプリケーションクラッシュを引き起こします。
Javaではガベージコレクション時にリソースに割り当てられたメモリが解放され、アプリケーションのメモリリークが発生します。
メモリリーク検知タブのオンデマンドメモリプロファイリング機能で、コレクションを追跡し、線形回帰モデルで潜在的なリークを特定します。収集したオブジェクトの増加を追跡し、リークの根本原因を特定します。
オンデマンドメモリプロファイリングを用いて、多くのメモリを消費しているコードスタックのクラスを特定できます。選択した期間で収集されたすべてのオブジェクトとその関連するメトリックが表示されます。
オンデマンドメモリプロファイリングの開始方法は次のとおりです。
メモリプロファイリング開始ボタンが無効化されるケースは次のとおりです。
オンデマンドメモリプロファイリングが完了すると、取得データがメモリリーク検知タブに表示されます。次のビューで取得メトリックが表示されます。
テーブルビューでは、プロファイリング中に収集したオブジェクトとその関連メトリックを表示します。
パラメーター | 説明 |
クラス名 | メモリオブジェクトが含まれるクラスの名前です。 |
エレメント数 | メモリオブジェクトに保存されているエレメント数です。 |
オブジェクトリークステータス | オブジェクトがメモリリークしているかを次のマークで判別します。
|
オブジェクト作成時間 | オブジェクトが取得された時間です。 |
インスタンス名 | インスタンスの名前です。 |
直近のメモリイベント項目で、メモリオブジェクトに関連付いているメモリリークイベントと、発生した時間が表示されます。これにより、トラブルシュートの効率を上げ、同様のメモリリーク問題を防ぎます。
詳細ビューで、左パネルに表示されている各クラスをクリックすることで、メモリリークに関する追加情報を表示できます。
パラメーター | 説明 |
クラス名 | メモリオブジェクトを含んだクラスの名前です。 |
エレメント数 | メモリオブジェクトに保存されているエレメント数です。 |
各クラスをクリックして関連するメトリックを表示します。メトリックは3つのタブで分けられています。
画面上部に、オブジェクトのメモリリークステータス、エレメント数、オブジェクトサイズが表示されます。
エレメント数は、すべての時間での変更を95パーセンタイルで、エレメント数のグラフとして表示します。
直近のメモリイベントは、選択したクラスと関係するメモリイベントのサマリーとそのイベントの発生した時間を表示します。
コンテンツ検査が行われると、エージェントが選択したクラスのオブジェクトサイズを監視します。毎分(ユーザーが指定した時間幅内)オブジェクトサイスが変更している場合、毎分にエージェントがデータを取得し画面に表示します。そのため、毎分に更新されるデータをコンテンツ検査タブで取得できます。
コンテンツ検査の開始方法:
プロファイリングが完了すると、タイムスタンプと各メトリックが表示されます。
パラメーター | 説明 |
時間 | メモリオブジェクトが取得された時間です。 |
クラス | 取得されたメモリオブジェクトです。 |
数 | メモリオブジェクトに保存されているエレメント数です。 |
サイズ | メモリオブジェクトのサイズです。 |
アクセス追跡が行われると、エージェントが選択したクラス内のオブジェクトを監視します。オブジェクトにコードパスを経由したアクセスがあると、エージェントがそのコードパスを取得します。追跡が完了すると、取得メトリックが画面に表示されます。
アクセス追跡の開始方法:
追跡が完了すると、アクセス追跡タブにそのメトリックを表示します。
パラメーター | 説明 |
時間 | コードパスが取得された時価です。 |
コードパス | メモリオブジェクトが発見されたトレースです。 |
発生数 | 同じトレースが収集された回数です。 |
オブジェクトが取得された際にタイムスタンプのリストが中間パネルに表示されます。タイムスタンプをクリックすると、その時間で取得されたコードパスが→パネルに表示されます。
Javaアプリケーションが、コード内の論理エラーが原因で不要になったオブジェクト参照 (静的として宣言されたもの) を意図せずに保持している状況を考えます。これらの意図しないオブジェクト参照により、組み込みのガベージコレクションは、これらオブジェクトが消費するメモリを解放できなくなります。コレクションオブジェクトは継続的に増加し、アプリケーションの有効期間をでメモリ内に残るため、重要なメモリを他の場所で使用することができなくなります。
APMエージェントはどのようにオブジェクトがリークしているかを判別するか
Javaのオブジェクト収集の取得に、Site24x7は次の条件をもちます。
・メモリリークが発生した際に、ユーザーはオブジェクトの経過時間を指定する必要があります。
・コレクションまたはマップのエレメント数が1000を超えている必要があります。
・オブジェクトのサイズが5MBを超えている必要があります。
Javaエージェントはコレクションオブジェクトを取得し、線形回帰モデルを使用して潜在的なリークを確認します。長期間の増加が検知されるとSite24x7コレクションオブジェクトのサイズを監視します。潜在的な増加はコレクションオブジェクトが、潜在的なリークオブジェクトであるか、メモリリークの発生源であることを示します。
オブジェクトがリークしている可能性がある場合は、次の手順を実行してください。
リーク防止のためのベストプラクティス
・必要のない場所での静的なコレクションオブジェクトを無効にします。
・正確なコレクションとマップを選択します。
・ひし形演算子とジェネリック型を使用します