Java獲取Linux服務(wù)器CPU、內(nèi)存、磁盤信息的示例詳解
使用 Java Management API
通過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)
可以通過JMX監(jiān)控Java應(yīng)用的性能指標(biāo),并可以監(jiān)控JVM自身的內(nèi)存和線程使用情況。
使用命令行工具ProcessBuilder或Runtime.exec()
可以通過執(zhí)行系統(tǒng)命令(如top, df, free等)獲取系統(tǒng)信息,使用ProcessBuilder來運(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();
}
}
}
來執(zhí)行系統(tǒng)命令并獲取輸出
在Java中使用命令行工具監(jiān)控服務(wù)器的CPU、內(nèi)存和磁盤使用情況,可以通過ProcessBuilder或Runtime.exec()來執(zhí)行系統(tǒng)命令并獲取輸出。以下是實(shí)現(xiàn)的示例代碼:
1. 監(jiān)控CPU使用情況
可以使用top或mpstat命令來獲取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命令來獲取磁盤使用情況:
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)文章
java聯(lián)系人管理系統(tǒng)簡(jiǎn)單設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了java聯(lián)系人管理系統(tǒng)簡(jiǎn)單設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系
這篇文章主要介紹了詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系,本文先對(duì)兩種方法作了介紹,然后對(duì)二者聯(lián)系進(jìn)行分析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-09-09
SpringBoot打印詳細(xì)啟動(dòng)異常信息
這篇文章主要介紹了SpringBoot打印詳細(xì)啟動(dòng)異常信息,本文包含了詳細(xì)的過程解析與案例,概要的說明了如何去使用打印啟動(dòng)異常信息,需要的朋友可以參考下2021-06-06
spring data jpa 查詢自定義字段,轉(zhuǎn)換為自定義實(shí)體方式
這篇文章主要介紹了spring data jpa 查詢自定義字段,轉(zhuǎn)換為自定義實(shí)體方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
java項(xiàng)目中使用 Lombok遇到的問題小結(jié)
這篇文章主要介紹了java項(xiàng)目中使用 Lombok遇到的問題小結(jié),需要的朋友可以參考下2018-07-07
Spring基于常用AspectJ切點(diǎn)表達(dá)式使用介紹
AspectJ是一個(gè)基于Java語(yǔ)言的AOP框架,使用AspectJ需要導(dǎo)入Spring?AOP和AspectJ相關(guān)jar包,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
Java?對(duì)象在?JVM?中的內(nèi)存布局超詳細(xì)解說
這篇文章主要介紹了Java?對(duì)象在?JVM?中的內(nèi)存布局超詳細(xì)解說,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09

