Mendapatkan Informasi System dengan Java
29 Oct 2013Pada salah satu project yang sedang saya kerjakan, ada kebutuhan untuk mendapatkan informasi mengenai sistem dimana aplikasi diinstal. Informasi yang dibutuhkan antara lain:
- Sistem Operasi
- Kapasitas Memori
- Kapasitas Disk
- Jumlah Network Interface
- MAC Address dari masing-masing Network Interface
Dalam artikel ini, kita akan membahas cara mendapatkan berbagai informasi tersebut. Seperti biasa, kode program bisa diambil di repository Github saya.
Sistem Operasi
Informasi tentang Sistem Operasi dapat diperoleh dengan menggunakan class java.lang.System. Dari class ini kita bisa menggunakan method getProperty yang berisi berbagai informasi tentang sistem. Daftar property yang tersedia dapat dilihat di halaman dokumentasinya. Property yang berkaitan dengan sistem operasi adalah:
- os.name
- os.version
- os.arch
Berikut contoh penggunaannya
String os = System.getProperty("os.name");
os += ":" + System.getProperty("os.version");
os += ":" + System.getProperty("os.arch");
System.out.println(os);
Di laptop saya, outputnya seperti ini:
Linux:3.11.0-12-generic:amd64
Kapasitas Memori
Aplikasi Java berjalan di atas JVM, tidak langsung di atas sistem operasi. Untuk urusan memori, ada dua jenis memori yang kita kenal, yaitu memori yang disediakan untuk JVM dan memori yang tersedia di komputer (RAM). Hal ini sering menimbulkan kebingungan di programmer Java pemula, yaitu
Komputer saya RAM-nya 8 GB, kenapa aplikasi Java saya cuma bisa pakai 2 GB?
Biasanya penyebabnya adalah karena memori yang dialokasikan untuk JVM hanya 2 GB.
Memori Fisik (RAM)
Untuk mendapatkan informasi tentang memori fisik yang tersedia, kita gunakan class com.sun.management.OperatingSystemMXBean
. Berikut cara mendapatkan object dari class tersebut.
OperatingSystemMXBean osBean
= (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
Setelah itu, kita bisa gunakan untuk mendapatkan informasi memori sebagai berikut
Long memory = osBean.getTotalPhysicalMemorySize();
Dokumentasi lengkap dari class tersebut bisa dibaca di sini.
Memori JVM
Ada dua variabel yang menginformasikan memori JVM, yaitu memori yang dialokasikan, dan memori yang terpakai. Aplikasi kita boleh menggunakan memori maksimal sebanyak yang dialokasikan. Tapi aplikasi belum tentu menggunakan semuanya, hanya sebagian saja yang terpakai. Informasi memori JVM bisa didapatkan dari class java.lang.Runtime
.
Berikut cara untuk mendapatkan memori yang dialokasikan untuk JVM
Long totalMemory = Runtime.getRuntime().totalMemory();
Sedangkan untuk mendapatkan memori terpakai, kita kurangi totalMemory
dengan freeMemory
(memori yang tidak terpakai)
Long freeMemory = Runtime.getRuntime().freeMemory();
Long terpakai = totalMemory - freeMemory;
Lebih lengkapnya bisa dilihat langsung di dokumentasi class Runtime
Kapasitas Storage
Informasi tentang storage bisa didapatkan di class java.io.File
. Pertama, kita buat dulu objek File
yang mengarah ke partisi yang ingin kita ketahui informasinya.
Untuk Windows, gunakan C:
, D:
, dan seterusnya.
File f = new File("C:");
Untuk Linux, gunakan /
, /home
, dan sebagainya.
File f = new File("/home");
Ada beberapa method yang disediakan yaitu:
- totalSpace() : kapasitas storage
- usableSpace() : kapasitas yang bisa digunakan
- freeSpace() : ruang kosong
Kita tentu bertanya-tanya, apa bedanya usable
dan free
? Free adalah ruang yang tidak terpakai, tapi belum tentu boleh dipakai karena masalah permission, ijin akses, dan sebagainya. Usable adalah ruang yang boleh dipakai. Kadang-kadang, nilai usable
sama dengan nilai free
. Penjelasannya bisa dibaca di sini.
Cara pakainya tidak sulit.
Long totalSpace = f.getTotalSpace();
Long usableSpace = f.getUsableSpace();
Long freeSpace = f.getFreeSpace();
Network Interface
Informasi tentang network interface bisa didapatkan di java.net.NetworkInterface
. Pertama, kita dapatkan dulu seluruh interface yang ada di komputer. Satu komputer (apalagi server) biasa memiliki lebih dari satu interface. Laptop saja biasanya punya dua, ethernet dan wifi.
Enumeration<NetworkInterface> semuaInterface = NetworkInterface.getNetworkInterfaces();
Setelah itu, kita bisa melakukan loop untuk mendapatkan jumlah interface, nama interface, dan MAC addressnya.
Integer jumlah = 0;
while(semuaInterface.hasMoreElements()){
NetworkInterface ni = semuaInterface.nextElement();
System.out.println("Nama Interface : "+ni.getDisplayName());
byte[] mac = ni.getHardwareAddress();
if(mac != null){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
}
System.out.println("MAC Address : "+sb.toString());
}
jumlah++;
}
System.out.println("Jumlah interface : "+jumlah);
Demikianlah cara mendapatkan informasi tentang sistem tempat aplikasi Java kita dijalankan.