Application Real-Time Monitoring Service (ARMS) のメモリホットスポット機能は、Java 仮想マシン (JVM) の高いヒープメモリ使用量の根本原因を特定するのに役立ちます。この機能は、継続的プロファイリングを使用して、スレッドがヒープ割り当てのしきい値を超えるたびに、メモリ割り当てのサイズと頻度を記録します。また、その時点でメソッドスタックのスナップショットもキャプチャします。システムで JVM のヒープメモリ使用率が高くなった場合、メモリホットスポットは、大量または頻繁なヒープメモリリクエストを引き起こす特定のビジネスロジックメソッドを迅速に特定します。
メモリホットスポットの有効化
ARMS コンソールにログインします。左側メニューで、 を選択します。
[Application List] ページで、ページ上部でリージョンを選択し、アプリケーションの名前をクリックします。
説明[Language] 列のアイコンは、以下を示します:
:Application Monitoring に接続されている Java アプリケーション。
:Application Monitoring に接続されている Go アプリケーション。
:Application Monitoring に接続されている Python アプリケーション。[-] : Managed Service for OpenTelemetry に接続されているアプリケーション。
左側メニューで [Application Settings] をクリックし、 [Custom Configuration] タブをクリックします。
[Continuous profiling] セクションで、 [Main switch] をオンにし、 次に [Memory hotspot] スイッチをオンにします。有効にするアプリケーションインスタンスの IP アドレス、またはインスタンスグループの CIDR ブロックを指定します。
ページ下部にある [Save] をクリックします。
変更はすぐに有効になります。アプリケーションを再起動する必要はありません。
メモリホットスポットデータの表示
例:1 秒あたり 1 MB のヒープメモリを割り当てるメソッド。
public class FixedRateAllocAction {
// リクエストのエントリポイント。
public void runBusiness() {
sink = new byte[1024];
}
}ARMS コンソールにログインします。左側メニューで、 を選択します。
[Application List] ページで、ページ上部でリージョンを選択し、アプリケーションの名前をクリックします。
説明[Language] 列のアイコンは、以下を示します:
:Application Monitoring に接続されている Java アプリケーション。
:Application Monitoring に接続されている Go アプリケーション。
:Application Monitoring に接続されている Python アプリケーション。[-] : Managed Service for OpenTelemetry に接続されているアプリケーション。
左側メニューで [Continuous profiling] をクリックします。左側のインスタンスリストから、対象のインスタンスを選択します。次に、右側でデータの時間範囲を設定します。
[Single View] タブで、 データをフィルタリングし、集計と分析を表示できます。
[Aggregation & Analysis] をクリックします。表示されたページで、 [Profiling Type] を [Allocated Memory] に設定します。
説明プロファイリングタイプ:
[CPU Time] :CPU ホットスポットのプロファイリングデータ。詳細については、「CPU ホットスポットによる高い CPU 使用率の診断」をご参照ください。
[Allocated Memory] :メモリ割り当て量に関するメモリホットスポットのプロファイリングデータです。
[Allocations] :メモリ割り当て頻度に関するメモリホットスポットのプロファイリングデータです。これにより、どのメソッドが頻繁にメモリを要求するかを特定できます。
[Aggregation & Analysis] ページでは、左側のリストにこの呼び出しに関与するすべてのメソッドのヒープメモリ割り当て量が表示されます。右側のフレームグラフは、それらのメソッドのスタックトレースから生成されます。列は次のように定義されます:
[Self] 列には、メソッドが消費するリソースが表示されます (子メソッドは除く)。これは、大量のリソースを消費するメソッドを特定するのに役立ちます。
[Total] 列には、メソッドとその子メソッドが消費するリソースが表示されます。これは、呼び出しスタックのリソース消費において最も大きな要因となっているものを特定するのに役立ちます。
次の分析を実行します:
[Self] 列を降順でソートします。 [Self] の値が最も大きいメソッド com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness() を見つけてクリックします。右側のフレームグラフは、関連するメソッドにフォーカスします。
右側のフォーカスされたフレームグラフでは、 com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness() が一番上にある最も幅の広いフレームです。
フレームグラフの上部にある幅の広いフレームは、アプリケーションで定義されたメソッドを表します。これは、 com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness() メソッドが、プロファイリング中に大量のリソースを消費した重大なパフォーマンスボトルネックであることを示しています。メソッド名を使用して、最適化の余地がないかビジネスロジックを調査します。
この分析に基づくと、 com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness() メソッドは 1 分以内に 56.56 MB のヒープメモリを割り当てており、これは例と一致します。
関連ドキュメント
継続的プロファイリング機能を使用して、低速トレースや高い CPU 使用率を調査できます。詳細については、次のトピックをご参照ください:
継続的プロファイリングに関する一般的な問題については、「よくある質問」をご参照ください。