java檢測當前CPU負載狀態的方法

TechSynapse發表於2024-06-04

1.java檢測當前CPU負載狀態

在Java中,直接檢測CPU負載狀態並不像在作業系統命令列中那樣簡單,因為Java標準庫並沒有直接提供這樣的功能。但是,我們可以透過幾種方法間接地獲取CPU負載資訊:

(1)使用作業系統命令:我們可以透過執行特定的系統命令(如topmpstatuptime等)來獲取CPU負載資訊,並將這些命令的輸出解析為Java程式可以理解的格式。這通常需要使用Runtime.getRuntime().exec()方法。

(2)使用第三方庫:有些第三方庫(如OSHI、Sigar等)提供了獲取系統資訊(包括CPU負載)的功能。

下面我將給出一個使用Runtime.getRuntime().exec()方法和Linux系統的mpstat命令的示例。請注意,這個示例僅適用於Linux系統,並且需要系統上已經安裝了sysstat包(它包含了mpstat命令)。

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
  
public class CPULoadChecker {  
  
    public static void main(String[] args) {  
        String command = "mpstat 1 1"; // 執行mpstat命令,每秒更新一次,總共更新一次  
        try {  
            Process process = Runtime.getRuntime().exec(command);  
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));  
            String line;  
            boolean foundCpuLine = false;  
  
            // 讀取命令的輸出  
            while ((line = reader.readLine()) != null) {  
                // 跳過標題行和其他不相關的行,只保留包含CPU資訊的行  
                if (line.startsWith("avg-cpu:")) {  
                    foundCpuLine = true;  
                    System.out.println("CPU Load Information:");  
                    System.out.println(line); // 列印CPU負載資訊行  
                    break; // 假設我們只關心第一行(平均負載)  
                }  
            }  
  
            if (!foundCpuLine) {  
                System.out.println("No CPU load information found.");  
            }  
  
            reader.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

在這個示例中,mpstat 1 1命令將執行mpstat並輸出一次CPU統計資訊,每秒更新一次。但是,由於我們只關心一次輸出(即平均負載),所以我們只讀取並列印第一行包含"avg-cpu:"的行。

請注意,這個示例只是一個基本的起點,我們可能需要根據我們的具體需求進行調整和擴充套件。例如,我們可能需要解析mpstat命令的輸出以獲取更具體的CPU負載資訊(如使用者空間、核心空間、空閒時間等)。此外,如果我們需要在Windows或其他作業系統上執行此程式碼,我們需要使用適當的系統命令來替換mpstat

2.完整的程式碼示例

我們使用Runtime.getRuntime().exec()來執行系統命令,並解析Linux系統的top命令的輸出,以獲取一個近似的CPU負載百分比。但是,請注意,top命令的輸出是動態的,並且包含了多行文字,解析起來可能相對複雜。

以下是一個簡化的示例,它使用top -bn1命令(非互動模式,只執行一次)來獲取CPU使用情況,並嘗試解析其中的資訊。但是,由於top命令的輸出格式可能會因系統配置和版本而異,所以這裡只提供了一個基本的框架。

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
  
public class CPULoadChecker {  
  
    public static void main(String[] args) {  
        String os = System.getProperty("os.name").toLowerCase();  
        if (os.contains("win")) {  
            System.out.println("This example is for Linux. For Windows, consider using other methods.");  
            return;  
        }  
  
        String command = "top -bn1 | grep 'Cpu(s)'"; // 執行top命令並只獲取Cpu(s)行  
        try {  
            Process process = Runtime.getRuntime().exec(new String[]{"bash", "-c", command});  
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));  
            String line;  
            boolean foundCpuLine = false;  
  
            // 讀取命令的輸出  
            while ((line = reader.readLine()) != null) {  
                if (line.startsWith("Cpu(s):")) {  
                    foundCpuLine = true;  
                    // 解析Cpu(s)行的資訊,這裡只獲取使用者+系統時間作為負載的近似值  
                    String[] parts = line.split("\\s+");  
                    if (parts.length > 7) {  
                        String user = parts[1]; // 使用者空間時間  
                        String system = parts[3]; // 核心空間時間  
                        double load = Double.parseDouble(user) + Double.parseDouble(system);  
                        // 假設我們只關心使用者和系統時間,並且它們都是以百分比表示的  
                        // 注意:這不是真正的CPU負載,只是使用者和系統時間的總和  
                        System.out.printf("Approximate CPU Load: %.2f%% (User: %.2f%%, System: %.2f%%)%n",  
                                load, Double.parseDouble(user), Double.parseDouble(system));  
                    }  
                    break;  
                }  
            }  
  
            if (!foundCpuLine) {  
                System.out.println("No CPU load information found.");  
            }  
  
            reader.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

注意

(1)這個示例假設我們的系統支援bashtop命令,並且top命令的輸出格式與示例中描述的相匹配。

(2)這個方法只是一個近似值,因為它只考慮了使用者和系統時間,而沒有考慮等待時間、空閒時間等。

(3)如果我們需要更準確的CPU負載資訊,建議使用專門的系統監控工具或庫,如OSHISigar等。

(4)在Windows系統上,我們需要使用不同的命令和解析邏輯,因為top命令在Windows上並不存在。我們可以考慮使用wmic命令或其他Windows特定的方法。

3.Windows系統中Java檢測當前CPU負載狀態

在Windows系統中,Java檢測當前CPU負載狀態通常需要使用一些特定的命令或者第三方庫,因為Java標準庫並不直接提供這樣的功能。以下是幾種常見的方法:

3.1使用wmic命令

我們可以透過執行wmic命令(Windows Management Instrumentation Command-line)來獲取CPU的使用率。以下是一個示例程式碼片段,展示瞭如何使用Runtime.getRuntime().exec()方法來執行wmic命令並解析其輸出:

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
  
public class CPULoadCheckerWindows {  
  
    public static void main(String[] args) {  
        String command = "wmic cpu get loadpercentage /value";  
        try {  
            Process process = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", command});  
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));  
            String line;  
            while ((line = reader.readLine()) != null) {  
                // 跳過標題行和其他不相關的行  
                if (line.contains("LoadPercentage=")) {  
                    // 解析CPU負載百分比  
                    String[] parts = line.split("=");  
                    if (parts.length > 1) {  
                        String cpuLoad = parts[1].trim();  
                        // 移除百分號並轉換為整數(如果需要)  
                        int load = Integer.parseInt(cpuLoad.replace("%", ""));  
                        System.out.println("CPU Load: " + load + "%");  
                    }  
                    break; // 假設我們只關心第一行  
                }  
            }  
            reader.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

3.2使用第三方庫

我們也可以使用第三方庫來獲取CPU負載資訊。這些庫通常提供了跨平臺的支援,使得程式碼更易於維護和擴充套件。例如,我們可以使用OSHI(Open System and Hardware Information)庫來獲取CPU使用率。

以下是一個使用OSHI庫獲取CPU負載的示例:

首先,我們需要在專案中新增OSHI庫的依賴。如果我們使用Maven,可以在pom.xml檔案中新增以下依賴:

<dependency>  
    <groupId>oshi-project</groupId>  
    <artifactId>oshi-core</artifactId>  
    <version>我們的版本號</version>  
</dependency>

然後,我們可以編寫以下程式碼來獲取CPU負載:

import oshi.SystemInfo;  
import oshi.hardware.CentralProcessor;  
  
public class CPULoadCheckerWithOshi {  
  
    public static void main(String[] args) {  
        SystemInfo si = new SystemInfo();  
        CentralProcessor cpu = si.getHardware().getProcessor();  
  
        // 獲取CPU的最近負載(過去1秒、5秒和15秒的負載)  
        double[] loadAverage = cpu.getSystemCpuLoadAverage(1, 5, 15);  
        System.out.println("CPU Load (1s): " + loadAverage[0] * 100 + "%");  
        System.out.println("CPU Load (5s): " + loadAverage[1] * 100 + "%");  
        System.out.println("CPU Load (15s): " + loadAverage[2] * 100 + "%");  
    }  
}

請注意,我們需要將我們的版本號替換為OSHI庫的最新版本號。此外,由於OSHI庫使用本地庫(JNI)來獲取系統資訊,因此我們可能需要確保在執行時環境中包含了正確的本地庫檔案。

相關文章