Saat ini saya sedang membangun aplikasi Java yang akhirnya bisa dijalankan pada banyak platform yang berbeda, tetapi terutama varian Solaris, Linux dan Windows.
Adakah yang berhasil mengekstraksi informasi seperti ruang disk saat ini yang digunakan, pemanfaatan CPU, dan memori yang digunakan dalam OS yang mendasarinya? Bagaimana dengan apa yang dikonsumsi aplikasi Java itu sendiri?
Lebih disukai saya ingin mendapatkan informasi ini tanpa menggunakan JNI.
Runtime.getRuntime().freeMemory()
seperti yang disarankan dalam jawaban yang diterima TIDAK memberi Anda jumlah memori bebas.Jawaban:
Anda bisa mendapatkan beberapa informasi memori terbatas dari kelas Runtime. Sebenarnya bukan apa yang Anda cari, tapi saya pikir saya akan menyediakannya demi kelengkapan. Ini adalah contoh kecil. Sunting: Anda juga bisa mendapatkan informasi penggunaan disk dari kelas java.io.File. Hal-hal penggunaan ruang disk memerlukan Java 1.6 atau lebih tinggi.
sumber
The java.lang.management paket tidak memberikan info lebih banyak daripada Runtime - misalnya itu akan memberikan memori tumpukan (
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
) terpisah dari memori non-tumpukan (ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
).Anda juga bisa mendapatkan proses penggunaan CPU (tanpa menulis kode JNI Anda sendiri), tetapi Anda harus menggunakan
java.lang.management.OperatingSystemMXBean
acom.sun.management.OperatingSystemMXBean
. Ini berfungsi pada Windows dan Linux, saya belum mengujinya di tempat lain.Misalnya ... panggil metode get getCpuUsage () lebih sering untuk mendapatkan pembacaan yang lebih akurat.
sumber
OperatingSystemMXBean
kecom.sun.management.OperatingSystemMXBean
dan kata pengantar semua contohgetOperatingSystemMXBean()
denganManagementFactory.
. Anda perlu mengimpor semua kelas dengan tepat.getCpuUsage
rata-rata bahwa sistem menggunakan semua Prosesor yang tersedia sebesar 100%?((double)( processCpuTime - lastProcessCpuTime )) / ((double)( systemTime - lastSystemTime ))
Saya pikir metode terbaik di luar sana adalah mengimplementasikan SIGAR API oleh Hyperic . Ini bekerja untuk sebagian besar sistem operasi utama (sangat dekat dengan apa pun yang modern) dan sangat mudah digunakan. Pengembang sangat responsif terhadap forum dan milis mereka. Saya juga suka bahwa itu adalah lisensi
GPL2Apache . Mereka memberikan banyak contoh di Jawa juga!SIGAR == Alat Informasi, Pengumpulan Dan Pelaporan Sistem.
sumber
Ada proyek Java yang menggunakan JNA (jadi tidak ada perpustakaan asli untuk menginstal) dan sedang dalam pengembangan aktif. Saat ini mendukung Linux, OSX, Windows, Solaris dan FreeBSD dan menyediakan RAM, CPU, Baterai dan informasi sistem file.
sumber
Untuk windows saya pergi ke sini.
Ini tautan dengan detail.
sumber
Anda bisa mendapatkan beberapa informasi tingkat sistem dengan menggunakan
System.getenv()
, meneruskan nama variabel lingkungan yang relevan sebagai parameter. Misalnya, di Windows:Untuk sistem operasi lain, ada / tidaknya dan nama variabel lingkungan yang relevan akan berbeda.
sumber
Tambahkan ketergantungan OSHI melalui pakar:
Persentase kapasitas baterai tersisa:
sumber
Lihat API yang tersedia di paket manajemen java.lang.man . Sebagai contoh:
OperatingSystemMXBean.getSystemLoadAverage()
ThreadMXBean.getCurrentThreadCpuTime()
ThreadMXBean.getCurrentThreadUserTime()
Ada banyak hal berguna lainnya di sana juga.
sumber
Biasanya, untuk mendapatkan informasi OS tingkat rendah Anda dapat memanggil perintah khusus OS yang memberi Anda informasi yang Anda inginkan dengan Runtime.exec () atau membaca file seperti / proc / * di Linux.
sumber
Penggunaan CPU tidak mudah - java.lang.management via com.sun.management.OperatingSystemMXBean.getProcessCpuTime mendekati (lihat cuplikan kode Patrick yang sangat baik di atas) tetapi perhatikan bahwa itu hanya memberikan akses ke waktu yang dihabiskan CPU dalam proses Anda. itu tidak akan memberi tahu Anda tentang waktu CPU yang dihabiskan dalam proses lain, atau bahkan waktu CPU yang dihabiskan untuk melakukan aktivitas sistem yang terkait dengan proses Anda.
misalnya saya punya proses java jaringan-intensif - itu satu-satunya yang berjalan dan CPU pada 99% tetapi hanya 55% dari yang dilaporkan sebagai "prosesor CPU".
bahkan tidak memulai saya pada "rata-rata memuat" karena itu tidak berguna, meskipun menjadi satu-satunya item yang berhubungan dengan cpu pada kacang MX. jika hanya berjemur dalam kebijaksanaan sesekali mereka mengekspos sesuatu seperti "getTotalCpuTime" ...
untuk pemantauan CPU yang serius SIGAR yang disebutkan oleh Matt tampaknya merupakan taruhan terbaik.
sumber
Pada
Windows
, Anda dapat menjalankansysteminfo
perintah dan mengambil outputnya misalnya dengan kode berikut:sumber
Jika Anda menggunakan Jrockit VM maka berikut adalah cara lain untuk mendapatkan penggunaan CPU VM. Kacang Runtime juga dapat memberi Anda beban CPU per prosesor. Saya hanya menggunakan ini di Red Hat Linux untuk mengamati kinerja Tomcat. Anda harus mengaktifkan JMX remote di catalina.sh agar ini berfungsi.
sumber
Ini masih dalam pengembangan tetapi Anda sudah bisa menggunakan jHardware
Ini adalah perpustakaan sederhana yang memotong data sistem menggunakan Java. Ia bekerja di Linux dan Windows.
sumber
Salah satu cara sederhana yang dapat digunakan untuk mendapatkan informasi level OS dan saya uji di Mac saya yang berfungsi dengan baik:
Anda dapat menemukan banyak metrik yang relevan dari sistem operasi di sini
sumber
Hai Anda dapat melakukan ini dengan integrasi java / com. Dengan mengakses fitur WMI, Anda dapat memperoleh semua informasi.
sumber
Untuk mendapatkan System Load rata - rata 1 menit, 5 menit dan 15 menit di dalam kode java, Anda bisa melakukan ini dengan mengeksekusi perintah
cat /proc/loadavg
menggunakan dan menafsirkannya seperti di bawah ini:Dan untuk mendapatkan memori sistem fisik dengan mengeksekusi perintah
free -m
dan kemudian menafsirkannya sebagai berikut:sumber