すべてのプロダクト
Search
ドキュメントセンター

:メモリ診断機能を使用してヒープメモリの高使用率を診断する

最終更新日:Dec 30, 2024

Application Real-Time Monitoring Service (ARMS) のメモリ診断機能は、継続的なプロファイリング技術を使用して、各スレッドがヒープメモリ割り当てをトリガーしたときに割り当てられるメモリのサイズ、メモリ割り当ての数、およびメソッドスタックスナップショットを記録し、Java仮想マシン (JVM) のヒープメモリ高使用率の根本原因を特定します。JVM のヒープメモリ使用率が高い場合、この機能は、大量のヒープメモリを要求する、または大量のメモリ要求を送信するビジネスロジックメソッドを迅速に特定します。

メモリ診断機能を有効にする

  1. ARMS console にログインします。左側のナビゲーションペインで、アプリケーションモニタリング > アプリケーション一覧 を選択します。

  2. アプリケーション一覧ページで、上部のナビゲーションバーでリージョンを選択し、管理するアプリケーションの名前をクリックします。

    説明

    言語列に表示されるアイコンは、アプリケーションが記述されている言語を示します。

    Java图标: Javaアプリケーション

    image: Goアプリケーション

    image: Pythonアプリケーション

    ハイフン (-): Managed Service for OpenTelemetry で監視されているアプリケーション。

  3. 左側のナビゲーションペインで、アプリケーション設定をクリックします。表示されるページで、カスタム設定タブをクリックします。

  4. 継続的プロファイリングセクションで、メインスイッチメモリホットスポットをオンにし、アプリケーションインスタンスのIPアドレスまたは複数のインスタンスのCIDRブロックを設定します。

  5. タブの下部にある保存をクリックします。

    変更は、アプリケーションを再起動する必要なく有効になります。

継続的プロファイリング技術を使用してホットスポットメモリデータを表示する

次の例は、1秒あたり1MBのヒープメモリを要求するメソッドを示しています。

public class FixedRateAllocAction {

    // 要求メソッド。
   public void runBusiness() {
        try {
            sink = new byte[1024];
        } catch (InterruptedException e) {
            // 無視
        }
    }
}
  1. ARMS console にログインします。左側のナビゲーションペインで、アプリケーションモニタリング > アプリケーション一覧 を選択します。

  2. アプリケーション一覧ページで、上部のナビゲーションバーでリージョンを選択し、管理するアプリケーションの名前をクリックします。

    説明

    言語列に表示されるアイコンは、アプリケーションが記述されている言語を示します。

    Java图标: Javaアプリケーション

    image: Goアプリケーション

    image: Pythonアプリケーション

    ハイフン (-): Managed Service for OpenTelemetry で監視されているアプリケーション。

  3. 左側のナビゲーションペインで、継続的プロファイリングをクリックします。[継続的プロファイリング] ページで、表示するインスタンスとクエリする期間を選択します。

  4. 単一ビュータブで、データをクエリし、集計分析結果を表示できます。

    image

  5. 集計と分析をクリックします。表示されるページで、プロファイリングタイプパラメータを割り当て済みメモリに設定します。

    説明

    次のパフォーマンス分析タイプを使用できます。

    • CPU時間: 要求されたCPUコアの数。詳細については、CPU診断機能を使用して高いCPU使用率を診断する を参照してください。

    • 割り当て済みメモリ: 要求されたメモリのサイズ。

    • 割り当て: メモリ要求の数。メモリ要求の数に基づいて、頻繁にメモリを要求するメソッドを表示できます。

    image

    図の左側は、呼び出しに関係するすべてのメソッドのヒープメモリ使用量リストであり、右側はすべてのメソッド情報のフレームグラフです。

    • Self列には、スタック内で各メソッドが消費する時間またはリソースが表示されます。子メソッドが消費する時間またはリソースは含まれません。このデータを使用して、自身のために過剰な時間またはリソースを費やしているメソッドを特定できます。

    • Total列には、各メソッド自体に消費された時間またはリソースが表示されます。すべての子メソッドに消費された時間またはリソースが含まれます。このデータを使用して、最も多くの時間またはリソースを費やしているメソッドを特定できます。

    前の図に基づいて、次の分析を実行します。

    1. Self列の値を昇順に並べ替えます。値が最も大きいメソッドcom.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness()を見つけてクリックします。関連するメソッドがフレームグラフに表示されます。

      image

    2. フレームグラフのスタックトップで、com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness()メソッドのボックスが最も広いことがわかります。

    3. com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness()はアプリケーションで定義された最初のサービスメソッドであるため、com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness()メソッドが指定された期間に大量のリソースを消費していると結論付けることができます。このメソッドを使用して、関連メソッドのロジックを分析し、最適化できるかどうかを確認できます。

上記の分析は、com.alibaba.cloud.pressure.memory.FixedRateAllocAction.runBusiness()メソッドが1分間に56.56MBのメモリを要求していることを示しており、これはサンプルシナリオと論理的に一致しています。