このトピックでは、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 以降: メトリックは、
GarbageCollectionNotificationInfo
のGarbageCollectionNotificationInfo
イベントをサブスクライブすることで取得されます。
このメソッドは、リスト内の各オブジェクトが 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 のスペースを割り当て、スタックフレーム内のローカル変数テーブル、オペランドスタック、動的リンク、メソッドリターンアドレスなどの情報を格納します。
スレッドメトリック
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 | スレッドステータス。 |
ライブスレッドの場合、次の異なる状態が個別にカウントされます。
|
クラスメトリック
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 | 現在のサイクルでアンロードされたクラスの数。 |