Memantau Penggunaan Disk dan Metrik Lain di Java

1. Ikhtisar

Dalam tutorial singkat ini, kita akan membahas cara memantau metrik utama di Java. Kami akan fokus pada ruang disk, penggunaan memori, dan data utas - hanya menggunakan API Java inti .

Dalam contoh pertama kita, kita akan menggunakan kelas File untuk menanyakan informasi disk tertentu.

Kemudian, kita akan menganalisis penggunaan memori dan informasi prosesor dengan menyelami kelas ManagementFactory .

Terakhir, kita akan membahas cara memantau metrik utama ini pada waktu proses menggunakan Java Profilers .

2. Pengenalan Kelas File

Sederhananya, kelas File mewakili abstraksi dari file atau direktori. Ini dapat digunakan untuk memperoleh informasi penting tentang sistem file dan menjaga independensi OS terkait jalur file. Dalam tutorial ini, kita akan menggunakan kelas ini untuk memeriksa partisi root pada mesin Windows dan Linux.

3. ManagementFactory

Java menyediakan kelas ManagementFactory sebagai pabrik untuk mendapatkan kacang terkelola (MXBeans) yang berisi informasi spesifik tentang JVM . Kami akan memeriksa dua dalam contoh kode berikut:

3.1. MemoryMXBean

The MemoryMXBean merupakan antarmuka manajemen untuk sistem memori JVM. Pada runtime, JVM menciptakan satu contoh dari interface ini yang kita dapat mengambil menggunakan ManagementFactory 's getMemoryMXBean () metode.

3.2. ThreadMXBean

Mirip dengan MemoryMXBean , ThreadMXBean adalah antarmuka manajemen untuk sistem utas JVM. Itu bisa dipanggil menggunakan metode getThreadMXBean () dan menyimpan data kunci terkait utas.

Dalam contoh berikut, kami akan menggunakan ThreadMXBean untuk mendapatkan kelas ThreadInfo JVM - yang berisi informasi spesifik mengenai utas yang berjalan di JVM.

3. Memantau Penggunaan Disk

Dalam contoh kode ini, kita akan menggunakan kelas File untuk memuat informasi kunci tentang partisi. Contoh berikut akan mengembalikan ruang kosong, total, dan tersedia dari drive C: pada mesin Windows:

File cDrive = new File("C:"); System.out.println(String.format("Total space: %.2f GB", (double)cDrive.getTotalSpace() /1073741824)); System.out.println(String.format("Free space: %.2f GB", (double)cDrive.getFreeSpace() /1073741824)); System.out.println(String.format("Usable space: %.2f GB", (double)cDrive.getUsableSpace() /1073741824)); 

Demikian pula, kami dapat mengembalikan informasi yang sama untuk direktori root mesin Linux :

File root = new File("/"); System.out.println(String.format("Total space: %.2f GB", (double)root.getTotalSpace() /1073741824)); System.out.println(String.format("Free space: %.2f GB", (double)root.getFreeSpace() /1073741824)); System.out.println(String.format("Usable space: %.2f GB", (double)root.getUsableSpace() /1073741824)); 

Kode di atas mencetak total, ruang kosong dan dapat digunakan untuk file yang ditentukan. Secara default, metode di atas memberikan jumlah byte. Kami telah mengubah byte ini menjadi gigabyte agar hasilnya lebih mudah dibaca manusia.

4. Memantau Penggunaan Memori

Sekarang kita akan menggunakan kelas ManagementFactory untuk menanyakan memori yang tersedia untuk JVM dengan memanggil MemoryMXBean .

Dalam contoh ini, kami akan berfokus terutama pada kueri memori heap. Penting untuk diperhatikan bahwa memori non-heap juga dapat dikueri menggunakan MemoryMXBean:

MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); System.out.println(String.format("Initial memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getInit() /1073741824)); System.out.println(String.format("Used heap memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getUsed() /1073741824)); System.out.println(String.format("Max heap memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getMax() /1073741824)); System.out.println(String.format("Committed memory: %.2f GB", (double)memoryMXBean.getHeapMemoryUsage().getCommitted() /1073741824)); 

Contoh di atas mengembalikan memori awal, bekas, maks, dan komitmen masing-masing. Berikut penjelasan singkat tentang apa artinya:

  • Awal: Memori awal yang diminta JVM dari OS selama startup
  • Digunakan: Jumlah memori saat ini yang digunakan oleh JVM
  • Max: Memori maksimum yang tersedia untuk JVM. Jika batas ini tercapai, OutOfMemoryException dapat dilemparkan
  • Berkomitmen: Jumlah memori yang dijamin akan tersedia untuk JVM

5. Penggunaan CPU

Selanjutnya, kita akan menggunakan ThreadMXBean untuk mendapatkan daftar lengkap objek ThreadInfo dan menanyakannya untuk mendapatkan informasi berguna terkait thread saat ini yang berjalan di JVM.

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); for(Long threadID : threadMXBean.getAllThreadIds()) { ThreadInfo info = threadMXBean.getThreadInfo(threadID); System.out.println("Thread name: " + info.getThreadName()); System.out.println("Thread State: " + info.getThreadState()); System.out.println(String.format("CPU time: %s ns", threadMXBean.getThreadCpuTime(threadID))); } 

Pertama, kode mendapatkan daftar utas saat ini menggunakan metode getAllThreadIds . Untuk setiap utas, ia kemudian mengeluarkan nama dan status utas diikuti oleh waktu CPU untuk utas dalam nanodetik.

6. Memantau Metrik Menggunakan Profilers

Terakhir, perlu disebutkan bahwa kami dapat memantau metrik utama ini tanpa menggunakan kode Java apa pun . Java Profilers memantau dengan cermat konstruksi dan operasi utama di tingkat JVM dan menawarkan analisis memori, thread, dan lainnya secara real-time.

VisualVM adalah salah satu contoh profiler Java dan telah digabungkan dengan JDK sejak Java 6. Banyak lingkungan pengembangan terintegrasi (IDE) berisi plugin untuk memanfaatkan profiler sambil mengembangkan kode baru. Anda dapat mempelajari lebih lanjut tentang Java Profilers dan VisualVM di sini.

7. Kesimpulan

Di artikel ini, kami telah menyentuh tentang penggunaan API Java inti untuk menanyakan informasi penting tentang penggunaan disk, manajemen memori, dan informasi utas.

Kami telah melihat beberapa contoh penggunaan kelas File dan ManagmentFactory untuk mendapatkan metrik ini.