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=0Agen 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 parameterjava.lang.management.GarbageCollectorMXBean.Agen V4.4.0 dan lebih baru: Metrik diperoleh dengan berlangganan ke event
GarbageCollectionNotificationInfodariGarbageCollectionNotificationInfo.
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=0Catatan 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.
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.

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=0Selain 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. |
Untuk thread hidup, status berbeda berikut dihitung secara terpisah.
|
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=0Catatan 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.017969Agen 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. |