Java獲取Linux服務(wù)器CPU、內(nèi)存、磁盤信息的示例詳解
使用 Java Management API
通過(guò)Java自帶的ManagementFactory和MXBean接口獲取系統(tǒng)級(jí)別信息,如CPU負(fù)載和內(nèi)存使用情況。
示例代碼:
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.MemoryMXBean;
public class SystemMonitor {
public static void main(String[] args) {
OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
System.out.println("CPU負(fù)載: " + osBean.getSystemLoadAverage());
System.out.println("堆內(nèi)存使用: " + memoryBean.getHeapMemoryUsage().getUsed() + " bytes");
}
}
使用第三方庫(kù)OSHI
OSHI:一個(gè)強(qiáng)大的Java庫(kù),用于獲取操作系統(tǒng)和硬件信息,支持CPU、內(nèi)存、磁盤等監(jiān)控。示例代碼:
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.software.os.OperatingSystem;
public class SystemMonitor {
public static void main(String[] args) {
SystemInfo systemInfo = new SystemInfo();
CentralProcessor processor = systemInfo.getHardware().getProcessor();
OperatingSystem os = systemInfo.getOperatingSystem();
System.out.println("CPU負(fù)載: " + processor.getSystemCpuLoadBetweenTicks() * 100 + "%");
System.out.println("總內(nèi)存: " + systemInfo.getHardware().getMemory().getTotal() + " bytes");
}
}
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.GlobalMemory;
import oshi.software.os.FileSystem;
import oshi.software.os.OSFileStore;
import oshi.software.os.NetworkIF;
import oshi.software.os.OperatingSystem;
import oshi.software.os.OperatingSystemVersion;
public class SystemMetrics {
public static void main(String[] args) {
SystemInfo systemInfo = new SystemInfo();
CentralProcessor processor = systemInfo.getHardware().getProcessor();
GlobalMemory memory = systemInfo.getHardware().getMemory();
OperatingSystem os = systemInfo.getOperatingSystem();
FileSystem fileSystem = os.getFileSystem();
NetworkIF[] networkIFs = os.getNetworkIFs();
// CPU 使用率
double cpuLoad = processor.getSystemCpuLoad() * 100;
System.out.println("CPU Load: " + cpuLoad + "%");
// 內(nèi)存使用情況
long totalMemory = memory.getTotal();
long usedMemory = totalMemory - memory.getAvailable();
System.out.println("Used Memory: " + (usedMemory / (1024 * 1024)) + " MB");
System.out.println("Total Memory: " + (totalMemory / (1024 * 1024)) + " MB");
// 磁盤使用情況
for (OSFileStore fileStore : fileSystem.getFileStores()) {
System.out.println("Disk: " + fileStore.getMount() +
", Total: " + (fileStore.getTotalSpace() / (1024 * 1024)) + " MB" +
", Usable: " + (fileStore.getUsableSpace() / (1024 * 1024)) + " MB" +
", Used: " + ((fileStore.getTotalSpace() - fileStore.getUsableSpace()) / (1024 * 1024)) + " MB");
}
// 網(wǎng)絡(luò)帶寬使用情況
for (NetworkIF net : networkIFs) {
long[] prevIO = net.getBytesRecv();
long[] currIO = net.getBytesSent();
System.out.println("Network Interface: " + net.getName());
System.out.println("Received: " + (prevIO[0] / 1024) + " KB, Sent: " + (currIO[0] / 1024) + " KB");
}
}
}
使用 JMX(Java Management Extensions)
可以通過(guò)JMX監(jiān)控Java應(yīng)用的性能指標(biāo),并可以監(jiān)控JVM自身的內(nèi)存和線程使用情況。
使用命令行工具ProcessBuilder或Runtime.exec()
可以通過(guò)執(zhí)行系統(tǒng)命令(如top, df, free等)獲取系統(tǒng)信息,使用ProcessBuilder來(lái)運(yùn)行命令并獲取輸出。
示例代碼:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class CommandLineMonitor {
public static void main(String[] args) {
try {
Process process = new ProcessBuilder("sh", "-c", "top -bn1 | grep 'Cpu'").start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
來(lái)執(zhí)行系統(tǒng)命令并獲取輸出
在Java中使用命令行工具監(jiān)控服務(wù)器的CPU、內(nèi)存和磁盤使用情況,可以通過(guò)ProcessBuilder或Runtime.exec()來(lái)執(zhí)行系統(tǒng)命令并獲取輸出。以下是實(shí)現(xiàn)的示例代碼:
1. 監(jiān)控CPU使用情況
可以使用top或mpstat命令來(lái)獲取CPU使用情況。以下示例使用top命令:
mport java.io.BufferedReader;
import java.io.InputStreamReader;
public class CpuMonitor {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("sh", "-c", "top -bn1 | grep 'Cpu'");
Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("CPU使用情況: " + line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. 監(jiān)控內(nèi)存使用情況
可以使用free命令獲取內(nèi)存使用情況:
public class MemoryMonitor {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("sh", "-c", "free -h");
Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("內(nèi)存使用情況: " + line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. 監(jiān)控磁盤使用情況
可以使用df命令來(lái)獲取磁盤使用情況:
public class DiskMonitor {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("sh", "-c", "df -h");
Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("磁盤使用情況: " + line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. 組合監(jiān)控
可以將這些功能組合到一個(gè)程序中,以便在定時(shí)任務(wù)中執(zhí)行:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class SystemMonitor {
public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(() -> {
monitorCpu();
monitorMemory();
monitorDisk();
}, 0, 10, TimeUnit.SECONDS);
}
private static void monitorCpu() {
executeCommand("top -bn1 | grep 'Cpu'");
}
private static void monitorMemory() {
executeCommand("free -h");
}
private static void monitorDisk() {
executeCommand("df -h");
}
private static void executeCommand(String command) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("sh", "-c", command);
Process process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
到此這篇關(guān)于Java獲取Linux服務(wù)器CPU、內(nèi)存、磁盤信息的示例詳解的文章就介紹到這了,更多相關(guān)Java獲取Linux信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot hutool整合email的詳細(xì)過(guò)程
這篇文章主要介紹了spring boot hutool整合email的相關(guān)知識(shí),本文介紹兩種方式發(fā)送email文件,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
Java中List集合對(duì)象去重及按屬性去重的8種方法
這篇文章主要介紹了Java中List集合對(duì)象去重及按屬性去重的8種方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一地的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Java實(shí)現(xiàn)在Word中嵌入多媒體(視頻、音頻)文件
這篇文章主要介紹了Java如何實(shí)現(xiàn)在Word中嵌入多媒體(視頻、音頻)文件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)java有一定的幫助,感興趣的同學(xué)可以了解一下2021-12-12
java Comparator.comparing排序使用示例
本文主要介紹了java Comparator.comparing排序使用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
SSH框架網(wǎng)上商城項(xiàng)目第10戰(zhàn)之搭建商品類基本模塊
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第10戰(zhàn)之搭建商品類基本模塊的相關(guān)資料,有一定的實(shí)用性,感興趣的小伙伴們可以參考一下2016-06-06
Maven設(shè)置使用自定義的jar包到自己本地倉(cāng)庫(kù)
今天小編就為大家分享一篇關(guān)于Maven設(shè)置使用自定義的jar包到自己本地倉(cāng)庫(kù)的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10

