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

Application Real-Time Monitoring Service:JVM メトリック

最終更新日:Jun 06, 2025

このトピックでは、Java 仮想マシン ( JVM ) メモリ、GC、スレッド、クラス、およびファイル記述子に関連するメトリックの収集方法について説明します。

メモリメトリック

ARMS エージェントには、java.lang.management.ManagementFactory#getPlatformMXBeans(java.lang.Class<T>) JDK インターフェイスをパラメーター java.lang.management.MemoryPoolMXBean.class と共に定期的に呼び出すスケジュールされたタスクがあります。メモリメトリックを取得します。

このメソッドはリストを返します。リスト内の各オブジェクトは、 JVM 内のさまざまなメモリ空間の予想メモリ使用量を反映しています。次のコードスニペットは、このメソッドの使用方法を示しています。

public static void printCurrentJVMMemoryUsage() {
    List<MemoryPoolMXBean> beans = ManagementFactory.getPlatformMXBeans(MemoryPoolMXBean.class);
    for (MemoryPoolMXBean bean : beans) {
        System.out.printf("area=%s\tname=%s\tinitial=%d\tmax=%d\tcommited=%d\tuse=%d\n", bean.getType().name(),
                bean.getName(), bean.getUsage().getInit(), bean.getUsage().getMax(), bean.getUsage().getCommitted(), bean.getUsage().getUsed());
    }
}

このコードスニペットの出力は、 JVM のバージョンによって異なる場合があります。考えられる出力は次のとおりです。これには、各メモリ空間のタイプ、名前、初期サイズ、最大サイズ、コミット済みサイズ、および使用済みサイズが含まれます。

area=NON_HEAP	name=Code Cache	initial=2555904	max=134217728	commited=3211264	use=3139712
area=NON_HEAP	name=Metaspace	initial=0	max=-1	commited=8388608	use=7950584
area=NON_HEAP	name=Compressed Class Space	initial=0	max=1073741824	commited=1048576	use=919408
area=HEAP	name=PS Eden Space	initial=67108864	max=1409286144	commited=67108864	use=39057856
area=HEAP	name=PS Survivor Space	initial=11010048	max=11010048	commited=11010048	use=0
area=HEAP	name=PS Old Gen	initial=179306496	max=2863661056	commited=179306496	use=0

ARMS エージェントは、このデータを定期的に収集します。収集時に、次の表で詳しく説明するように、追加処理なしでこれらのメトリックを直接報告および記録します。

メトリック

説明

arms_jvm_mem_init_bytes

初期メモリサイズ。

arms_jvm_mem_max_bytes

最大メモリサイズ。

arms_jvm_mem_committed_bytes

コミット済みメモリサイズ。

arms_jvm_mem_used_bytes

使用済みメモリサイズ。

次の表は、2 つの主要なディメンションについて説明しています。

ディメンション

説明

area

メモリ空間タイプ。

heap、nonheap

id

メモリ空間名。

eden、survivor、total

JVM メモリ空間の詳細については、「JVM メモリの詳細」をご参照ください。

GC メトリック

  • V4.4.0 より前のエージェント: メトリックは、java.lang.management.ManagementFactory#getPlatformMXBeans(java.lang.Class<T>) JDK インターフェイスを定期的に呼び出し、java.lang.management.GarbageCollectorMXBean パラメーターを渡すスケジュールされたタスクによって取得されます。

  • エージェント V4.4.0 以降: メトリックは、GarbageCollectionNotificationInfoGarbageCollectionNotificationInfo イベントをサブスクライブすることで取得されます。

このメソッドは、リスト内の各オブジェクトが JVM 内のさまざまなガベージコレクターのステータスを反映するリストを返します。次のコードスニペットは、このメソッドの使用方法を示しています。

public static void printGC() {
    List<GarbageCollectorMXBean> beans = ManagementFactory.getPlatformMXBeans(GarbageCollectorMXBean.class);
    for (GarbageCollectorMXBean  bean : beans) {
        System.out.printf("name=%s\tgcCount=%d\tgcTime=%d\n", bean.getName(),
                bean.getCollectionCount(), bean.getCollectionTime());
    }
}

このコードスニペットの出力は、 JVM のバージョンによって異なる場合があります。考えられる出力は次のとおりです。これには、各ガベージコレクターの名前、ガベージコレクション ( GC ) の発生回数、および消費された GC 時間が含まれます。

name=PS Scavenge	gcCount=0	gcTime=0
name=PS MarkSweep	gcCount=0	gcTime=0

このデータは JVM の起動以降の累積値を記録するため、ARMS エージェントは、このデータを定期的に収集した後、前回の収集から取得した値を減算して、現在の期間 ( デフォルト 15 秒 ) 内の GC 発生回数と消費された GC 時間を計算することに注意してください。次に、次の表で説明するように、これらのメトリックを報告および記録します。

説明
  • Z ガベージコレクター ( ZGC ) および Shenandoah:

    • 一時停止: stop-the-world ( STW ) の期間。通常は 1 ミリ秒未満です

    • サイクル: GC の合計期間

  • その他: 遅延メトリックは、STW の期間、つまりすべての Java アプリケーションスレッドが GC のために一時停止されている期間のみを測定します。

メトリック

説明

arms_jvm_gc_delta

現在のサイクルでの GC 発生回数。

arms_jvm_gc_seconds_delta

現在のサイクルで消費された GC 時間。

実際のガベージコレクターの種類を考慮して、ユーザーの理解コストを削減するために、ARMS エージェントは実際のガベージコレクター名を「Young」と「Old」にマップし、次の表にリストされているディメンションに記録します。

ディメンション

説明

gen

GC タイプ。

young、old

cause

GC トリガー。エージェント V4.4.0 以降でサポートされています。

System.gc()、Heap Dump Initiated GC、Allocation Failure

次の表は、マッピング関係について説明しています。

ガベージコレクター名

世代値

Copy

young

G1 Young Gen

young

G1 Old Gen

old

G1 Young Generation

young

G1 Old Generation

old

ParNew

young

ConMarkSweep

old

ConcurrentMarkSweep

old

PS Scavenge

young

PS MarkSweep

old

PS Serial

young

MarkSweepCompact

old

最新の Z ガベージコレクター ( ZGC ) では GC の全体的な設計が大幅に変更されているため、YoungGC や FullGC などの以前の単純な分類方法は適用されなくなりました。ZGC は次のように個別にマップされます。

ガベージコレクター名

世代値

ZGC Cycles

cycles

ZGC Pauses

pauses

ZGC Minor Cycles

young_cycles

ZGC Minor Pauses

young_pauses

ZGC Major Cycles

old_cycles

ZGC Major Pauses

old_pauses

ARMS コンソールには、下の図に示すように、「スレッドスタックの使用量」と呼ばれるチャートが表示されることに注意してください。このメトリックは ARMS エージェントでは収集されません。現在のライブスレッド数に 1 MB を掛けて計算されます。デフォルトでは、 JVM は各スレッドに 1 MB のスペースを割り当て、スタックフレーム内のローカル変数テーブル、オペランドスタック、動的リンク、メソッドリターンアドレスなどの情報を格納します。

image.png

スレッドメトリック

ARMS エージェントには、 JDK インターフェイス java.lang.management.ManagementFactory#getThreadMXBean を定期的に呼び出してスレッドメトリックを取得するスケジュールされたタスクがあります。

このメソッドは、java.lang.management.ThreadMXBean タイプのインスタンスを返します。これは、現在の JVM スレッドの状況を反映しています。次のコードスニペットは、このメソッドの使用方法を示しています。

public static void printThreads() {
    ThreadMXBean threadMXBean = java.lang.management.ManagementFactory.getThreadMXBean();
    int threadCount = threadMXBean.getThreadCount();
    int daemonThreadCount = threadMXBean.getDaemonThreadCount();
    long totalStartedThreadCount = threadMXBean.getTotalStartedThreadCount();
    long terminatedThreadCount = totalStartedThreadCount - threadCount;
    System.out.printf("allStartedThreadCount=%d\tcurrentThreadCount=%d\tdaemonThreadCount=%d\tterminatedThreadCount=%d\n"
            , totalStartedThreadCount, threadCount, daemonThreadCount, terminatedThreadCount);
}

このコードスニペットの出力は、 JVM のバージョンによって異なる場合があります。考えられる出力は次のとおりです。これには、開始されたスレッドの累積数、ライブスレッドの数、デーモンスレッドの数、および現在の JVM で終了したスレッドの累積数が含まれます。終了したスレッドの累積数を除いて、他のスレッド数は ThreadMXBean メソッドを直接呼び出すことによって取得されることに注意してください。終了したスレッドの累積数は、開始されたスレッドの累積数から現在のライブスレッド数を減算することによって計算され、JVM の起動以降にタスクを完了して終了したスレッドの総数を表します。

allStartedThreadCount=5	currentThreadCount=5	daemonThreadCount=4	terminatedThreadCount=0

さらに、現在ライブ状態のスレッドの数については、エージェントは RUNNABLE、BLOCKED、WAITING、および TIMED_WAITING の各状態のスレッドの数を個別にカウントします。

ARMS エージェントは、このデータを定期的に収集します。収集後、次の表で詳しく説明するように、追加処理なしでこれらのメトリックを直接記録します。

メトリック

説明

arms_jvm_threads_count

初期メモリサイズ。

上記のさまざまなスレッドは、次の主要なディメンションによって区別されます。

ディメンション

説明

state

スレッドステータス。

  • live: ライブスレッドの数。

  • daemon: デーモンスレッドの数

  • terminated: 終了したスレッドの数。これは、ARMS エージェント 4.x でのみサポートされています。

ライブスレッドの場合、次の異なる状態が個別にカウントされます。

  • new: 新規状態

  • runnable: 実行可能状態

  • blocked: ブロック状態

  • wait: 待機状態

  • timed-wait: 時間指定待機状態

クラスメトリック

ARMS エージェントには、 JDK インターフェイス ManagementFactory.getClassLoadingMXBean() を定期的に呼び出して、クラスの読み込みメトリックを取得するスケジュールされたタスクがあります。

このメソッドは、java.lang.management.ClassLoadingMXBean タイプのインスタンスを返します。これは、現在の JVM クラスの状況を反映しています。次のコードスニペットは、このメソッドの使用方法を示しています。

public static void printCurrentJVMMemoryUsage() {
    ClassLoadingMXBean classLoaderMXBean = ManagementFactory.getClassLoadingMXBean();
    long totalLoadedClassCount = classLoaderMXBean.getTotalLoadedClassCount();
    long unloadedClassCount = classLoaderMXBean.getUnloadedClassCount();
    System.out.printf("totalLoadedClassCount=%d\tunloadedClassCount=%d\n"
            , totalLoadedClassCount, unloadedClassCount);
}

このコードスニペットの出力は、 JVM のバージョンによって異なる場合があります。考えられる出力は次のとおりです。これには、現在の JVM によって読み込まれたクラスの累積数とアンロードされたクラスの累積数が含まれます。

totalLoadedClassCount=1355	unloadedClassCount=0

このデータは JVM の起動以降の累積値を記録するため、ARMS エージェントは、このデータを定期的に収集した後、前回の収集から取得した値を減算して、現在の期間 ( デフォルト 15 秒 ) 内に読み込まれたクラスとアンロードされたクラスの数を計算することに注意してください。次に、次の表で説明するように、これらのメトリックを報告および記録します。

メトリック

説明

arms_class_load_loaded

現在のサイクルで読み込まれたクラスの数。

arms_class_load_un_loaded

現在のサイクルでアンロードされたクラスの数。

ファイル記述子メトリック

ARMS エージェントには、 JDK インターフェイス ManagementFactory.getOperatingSystemMXBean() を定期的に呼び出して、ファイル記述子メトリックを取得するスケジュールされたタスクがあります。

このメソッドは、java.lang.management.OperatingSystemMXBean タイプのインスタンスを返します。これは、現在の JVM の開いているファイル記述子を反映しています。次のコードスニペットは、このメソッドの使用方法を示しています。

public static void printFDUsage() {
    OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
    if (!(operatingSystemMXBean instanceof UnixOperatingSystemMXBean)) {
        return;
    }
    long openFDCount = ((UnixOperatingSystemMXBean) operatingSystemMXBean).getOpenFileDescriptorCount();
    long maxFDCount = ((UnixOperatingSystemMXBean) operatingSystemMXBean).getMaxFileDescriptorCount();
    System.out.printf("openFDCount=%d\tfdOpenRatio=%f\n"
            , openFDCount, (double) openFDCount / maxFDCount);
}

このコードスニペットの出力は、 JVM のバージョンによって異なる場合があります。考えられる出力は次のとおりです。これには、現在の JVM の開いているファイル記述子の数とファイル記述子のオープン率が含まれます。ファイル記述子のオープン率は、現在開いているファイル記述子の数を、現在の JVM が開くことができるファイル記述子の総数で割ることによって計算されます。

openFDCount=184	fdOpenRatio=0.017969

ARMS エージェントは、このデータを定期的に収集します。収集後、次の表で詳しく説明するように、追加処理なしでこれらのメトリックを直接記録します。

メトリック

説明

arms_file_desc_open_count

現在の JVM によって開かれているファイル記述子の数。

arms_file_desc_open_ratio

現在のサイクルでアンロードされたクラスの数。