全部产品
Search
文档中心

Application Real-Time Monitoring Service:Metrik JVM

更新时间:Jul 02, 2025

Topik ini menjelaskan cara pengumpulan metrik terkait memori Java Virtual Machine (JVM), GC, thread, kelas, dan deskriptor file dilakukan.

Metrik Memori

Agen ARMS memiliki tugas terjadwal yang secara berkala memanggil antarmuka JDK java.lang.management.ManagementFactory#getPlatformMXBeans(java.lang.Class<T>) dengan parameter java.lang.management.MemoryPoolMXBean.class untuk mendapatkan metrik memori.

Metode ini mengembalikan daftar di mana setiap objek mencerminkan penggunaan memori dari ruang memori berbeda dalam JVM. Potongan kode berikut menunjukkan cara menggunakan metode ini.

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());
    }
}

Keluaran potongan kode ini dapat bervariasi di berbagai versi JVM. Keluaran yang mungkin ditampilkan mencakup jenis, nama, ukuran awal, ukuran maksimum, ukuran yang dialokasikan, dan ukuran yang digunakan dari setiap ruang memori.

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

Agen ARMS secara berkala mengumpulkan data ini, lalu melaporkan dan mencatat metrik tersebut tanpa pemrosesan tambahan, seperti yang dijelaskan dalam tabel berikut.

Metrik

Deskripsi

arms_jvm_mem_init_bytes

Ukuran memori awal.

arms_jvm_mem_max_bytes

Ukuran memori maksimum.

arms_jvm_mem_committed_bytes

Ukuran memori yang dialokasikan.

arms_jvm_mem_used_bytes

Ukuran memori yang digunakan.

Tabel berikut menjelaskan dua dimensi utama.

Dimensi

Deskripsi

Contoh

area

Jenis ruang memori.

heap, nonheap

id

Nama ruang memori.

eden, survivor, total

Untuk informasi lebih lanjut tentang ruang memori JVM, lihat Detail memori JVM.

Metrik GC

  • Agen sebelum V4.4.0: Metrik diperoleh oleh tugas terjadwal yang secara berkala memanggil antarmuka JDK java.lang.management.ManagementFactory#getPlatformMXBeans(java.lang.Class<T>) dengan parameter java.lang.management.GarbageCollectorMXBean.

  • Agen V4.4.0 dan lebih baru: Metrik diperoleh dengan berlangganan ke event GarbageCollectionNotificationInfo dari GarbageCollectionNotificationInfo.

Metode ini mengembalikan daftar di mana setiap objek mencerminkan status pengumpul sampah berbeda dalam JVM. Potongan kode berikut menunjukkan cara menggunakan metode ini.

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());
    }
}

Keluaran potongan kode ini dapat bervariasi di berbagai versi JVM. Keluaran yang mungkin ditampilkan mencakup nama setiap pengumpul sampah, jumlah kejadian pengumpulan sampah (GC), dan waktu GC yang dikonsumsi.

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

Catatan bahwa, karena data ini mencatat nilai kumulatif sejak JVM dimulai, setelah mengumpulkan data ini secara berkala, agen ARMS mengurangi nilai yang diperoleh dari pengumpulan sebelumnya untuk menghitung jumlah kejadian GC dan waktu GC yang dikonsumsi dalam periode saat ini (default 15 detik). Kemudian melaporkan dan mencatat metrik ini seperti yang dijelaskan dalam tabel berikut.

Catatan
  • Z garbage collector (ZGC) dan Shenandoah:

    • Jeda: durasi stop-the-world (STW), biasanya lebih pendek dari 1 ms

    • Siklus: durasi total untuk GC

  • Lainnya: Metrik latensi hanya mengukur durasi STW, yaitu ketika semua thread aplikasi Java dihentikan untuk GC.

Metrik

Deskripsi

arms_jvm_gc_delta

Jumlah kejadian GC dalam siklus saat ini.

arms_jvm_gc_seconds_delta

Waktu GC yang dikonsumsi dalam siklus saat ini.

Mempertimbangkan berbagai pengumpul sampah aktual, untuk mengurangi biaya pemahaman pengguna, agen ARMS memetakan nama pengumpul sampah aktual ke "Young" dan "Old," dan mencatatnya dalam dimensi yang tercantum dalam tabel berikut.

Dimensi

Deskripsi

Contoh

gen

Jenis GC.

young, old

cause

Pemicu GC, didukung pada agen V4.4.0 dan lebih baru.

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

Tabel berikut menjelaskan hubungan pemetaan.

Nama pengumpul sampah

Nilai Gen

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

Karena perubahan signifikan dalam desain GC keseluruhan di Z Garbage Collector (ZGC) terbaru, metode klasifikasi sederhana sebelumnya seperti YoungGC dan FullGC tidak lagi berlaku. ZGC dipetakan secara terpisah sebagai berikut.

Nama pengumpul sampah

Nilai Gen

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

Catatan bahwa konsol ARMS menampilkan grafik yang disebut "Penggunaan Stack Thread," seperti yang ditunjukkan pada gambar di bawah ini. Metrik ini tidak dikumpulkan pada agen ARMS; itu dihitung dengan mengalikan jumlah thread hidup saat ini dengan 1MB. Secara default, JVM mengalokasikan 1MB ruang untuk setiap thread untuk menyimpan informasi seperti tabel variabel lokal, stack operand, tautan dinamis, dan alamat pengembalian metode dalam frame stack.

image.png

Metrik Thread

Agen ARMS memiliki tugas terjadwal yang secara berkala memanggil antarmuka JDK java.lang.management.ManagementFactory#getThreadMXBean untuk mendapatkan metrik thread.

Metode ini mengembalikan instance bertipe java.lang.management.ThreadMXBean, yang mencerminkan situasi thread JVM saat ini. Potongan kode berikut menunjukkan cara menggunakan metode ini.

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);
}

Keluaran potongan kode ini dapat bervariasi di berbagai versi JVM. Keluaran yang mungkin ditampilkan mencakup jumlah kumulatif thread yang dimulai, jumlah thread hidup, jumlah thread daemon, dan jumlah kumulatif thread yang diakhiri dalam JVM saat ini. Dicatat bahwa, kecuali untuk jumlah kumulatif thread yang diakhiri, jumlah thread lainnya diperoleh langsung dengan memanggil metode ThreadMXBean. Jumlah kumulatif thread yang diakhiri dihitung dengan mengurangi jumlah thread hidup saat ini dari jumlah kumulatif thread yang dimulai, mewakili jumlah total thread yang telah menyelesaikan tugas mereka dan diakhiri sejak JVM diluncurkan.

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

Selain itu, untuk jumlah thread hidup saat ini, agen akan secara terpisah menghitung jumlah thread dalam setiap status berikut: RUNNABLE, BLOCKED, WAITING, dan TIMED_WAITING.

Agen ARMS secara berkala mengumpulkan data ini, lalu mencatat metrik ini tanpa pemrosesan tambahan, seperti yang dijelaskan dalam tabel berikut.

Metrik

Deskripsi

arms_jvm_threads_count

Ukuran memori awal.

Thread yang berbeda tersebut dibedakan oleh dimensi kunci berikut.

Dimensi

Deskripsi

Contoh

state

Status thread.

  • live: jumlah thread hidup.

  • daemon: jumlah thread daemon

  • terminated: jumlah thread yang diakhiri. Ini hanya didukung oleh agen ARMS 4.x.

Untuk thread hidup, status berbeda berikut dihitung secara terpisah.

  • new: Status baru

  • runnable: Status runnable

  • blocked: Status blocked

  • wait: Status waiting

  • timed-wait: Status timed waiting

Metrik Kelas

Agen ARMS memiliki tugas terjadwal yang secara berkala memanggil antarmuka JDK ManagementFactory.getClassLoadingMXBean() untuk mendapatkan metrik pemuatan kelas.

Metode ini mengembalikan instance bertipe java.lang.management.ClassLoadingMXBean, yang mencerminkan situasi kelas JVM saat ini. Potongan kode berikut menunjukkan cara menggunakan metode ini.

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);
}

Keluaran potongan kode ini dapat bervariasi di berbagai versi JVM. Keluaran yang mungkin ditampilkan mencakup jumlah kumulatif kelas yang dimuat dan jumlah kumulatif kelas yang dilepaskan oleh JVM saat ini.

totalLoadedClassCount=1355	unloadedClassCount=0

Catatan bahwa, karena data ini mencatat nilai kumulatif sejak JVM dimulai, setelah mengumpulkan data ini secara berkala, agen ARMS mengurangi nilai yang diperoleh dari pengumpulan sebelumnya untuk menghitung jumlah kelas yang dimuat dan dilepaskan dalam periode saat ini (default 15 detik). Kemudian melaporkan dan mencatat metrik ini seperti yang dijelaskan dalam tabel berikut.

Metrik

Deskripsi

arms_class_load_loaded

Jumlah kelas yang dimuat dalam siklus saat ini.

arms_class_load_un_loaded

Jumlah kelas yang dilepaskan dalam siklus saat ini.

Metrik Deskriptor File

Agen ARMS memiliki tugas terjadwal yang secara berkala memanggil antarmuka JDK ManagementFactory.getOperatingSystemMXBean() untuk mendapatkan metrik deskriptor file.

Metode ini mengembalikan instance bertipe java.lang.management.OperatingSystemMXBean, yang mencerminkan deskriptor file terbuka dari JVM saat ini. Potongan kode berikut menunjukkan cara menggunakan metode ini.

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);
}

Keluaran potongan kode ini dapat bervariasi di berbagai versi JVM. Keluaran yang mungkin ditampilkan mencakup jumlah deskriptor file terbuka dan rasio pembukaan deskriptor file untuk JVM saat ini. Rasio pembukaan deskriptor file dihitung dengan membagi jumlah deskriptor file yang terbuka saat ini dengan jumlah total deskriptor file yang dapat dibuka oleh JVM saat ini.

openFDCount=184	fdOpenRatio=0.017969

Agen ARMS secara berkala mengumpulkan data ini, lalu mencatat metrik ini tanpa pemrosesan tambahan, seperti yang dijelaskan dalam tabel berikut.

Metrik

Deskripsi

arms_file_desc_open_count

Jumlah deskriptor file yang dibuka oleh JVM saat ini.

arms_file_desc_open_ratio

Jumlah kelas yang dilepaskan dalam siklus saat ini.