最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用OSHI獲取服務(wù)器信息方式

 更新時(shí)間:2025年09月15日 16:07:29   作者:Spirit_NKlaus  
這篇文章主要介紹了Java使用OSHI獲取服務(wù)器信息方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java使用OSHI獲取服務(wù)器信息

OSHI可以獲取系統(tǒng)信息(CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等),純Java實(shí)現(xiàn)(通過JNA訪問本地API,無需安裝本地庫),跨平臺支持。

引入依賴

<dependency>
	<groupId>com.github.oshi</groupId>
	<artifactId>oshi-core</artifactId>
    <version>6.6.5</version>
</dependency>

編寫測試用例

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import oshi.SystemInfo;
import oshi.hardware.*;
import oshi.software.os.OSProcess;
import oshi.software.os.OperatingSystem;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

@Slf4j
public class ResourceMonitorTest {

    @Test
    public void testGetResource() {
        // 獲取系統(tǒng)信息
        SystemInfo si = new SystemInfo();
        // 獲取硬件抽象層
        HardwareAbstractionLayer hardware = si.getHardware();

        log.info("===============================CPU信息===============================");
        CentralProcessor processor = hardware.getProcessor();
        CentralProcessor.ProcessorIdentifier processorIdentifier = processor.getProcessorIdentifier();

        String processorName = processorIdentifier.getName();
        log.info("CPU 名稱: {}", processorName);

        String vendor = processorIdentifier.getVendor();
        log.info("CPU 供應(yīng)商: {}", vendor);

        long cpuFreq = processorIdentifier.getVendorFreq();
        log.info("CPU 頻率: {}", cpuFreq);

        int logicalProcessorCount = processor.getLogicalProcessorCount();
        log.info("CPU 核心數(shù): {}", logicalProcessorCount);

        int physicalProcessorCount = processor.getPhysicalProcessorCount();
        log.info("CPU 物理核心數(shù): {}", physicalProcessorCount);

        // CPU 負(fù)載 (最近1/5/15分鐘)
        double[] loadAverage = processor.getSystemLoadAverage(3);
        log.info("CPU 負(fù)載: {}", loadAverage[0]);

        log.info("===============================實(shí)時(shí) CPU 使用率===============================");
        // 第一次調(diào)用獲取 ticks
        long[] prevTicks = processor.getSystemCpuLoadTicks();
        // 等待1秒
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        // 第二次調(diào)用計(jì)算使用率
        long[] ticks = processor.getSystemCpuLoadTicks();
        long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
        log.info("應(yīng)用程序CPU使用率:{}", user);

        long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
        log.info("應(yīng)用程序優(yōu)先CPU使用率:{}", nice);

        long sys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
        log.info("系統(tǒng)程序CPU使用率:{}", sys);

        long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
        log.info("CPU空閑時(shí)間:{}", idle);

        long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
        log.info("CPU等待率:{}", iowait);

        long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
        log.info("CPU中斷率:{}", irq);

        long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
        log.info("CPU軟中斷率:{}", softirq);

        long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
        log.info("CPU搶占率:{}", steal);

        long totalCpu = user + nice + sys + idle + iowait + irq + softirq + steal;
        log.info("CPU總使用率:{}", totalCpu);

        // 計(jì)算各狀態(tài)百分比
        double cpuUsage = 100d * (totalCpu - idle) / totalCpu;
        log.info("CPU使用率:{}", cpuUsage);

        double ioWaitPercent = 100d * iowait / totalCpu;
        log.info("IO等待使用率:{}", ioWaitPercent);

        log.info("===============================內(nèi)存信息===============================");
        GlobalMemory memory = hardware.getMemory();
        double gbNum = 1024.0 * 1024.0 * 1024.0;
        // 總內(nèi)存 (bytes)
        long totalMemory = memory.getTotal();
        BigDecimal totalMemoryDec = new BigDecimal(totalMemory / gbNum).setScale(2, RoundingMode.HALF_UP);
        log.info("總內(nèi)存:{}GB", totalMemoryDec);

        // 可用內(nèi)存 (bytes)
        long availableMemory = memory.getAvailable();
        BigDecimal availableMemoryDec = new BigDecimal(availableMemory / gbNum).setScale(2, RoundingMode.HALF_UP);
        log.info("可用內(nèi)存:{}GB", availableMemoryDec);

        // 已用內(nèi)存 (bytes)
        long usedMemory = totalMemory - availableMemory;
        BigDecimal usedMemoryDec = new BigDecimal(usedMemory / gbNum).setScale(2, RoundingMode.HALF_UP);
        log.info("已用內(nèi)存:{}GB", usedMemoryDec);

        // 交換空間信息
        long totalSwap = memory.getVirtualMemory().getSwapTotal();
        BigDecimal totalSwapDec = new BigDecimal(totalSwap / gbNum).setScale(2, RoundingMode.HALF_UP);
        log.info("總交換空間:{}GB", totalSwapDec);

        long usedSwap = memory.getVirtualMemory().getSwapUsed();
        BigDecimal usedSwapDec = new BigDecimal(usedSwap / gbNum).setScale(2, RoundingMode.HALF_UP);
        log.info("已用交換空間:{}GB", usedSwapDec);

        // 內(nèi)存使用率
        double memoryUsagePercent = 100d * usedMemory / totalMemory;
        BigDecimal memoryUsagePercentDec = new BigDecimal(memoryUsagePercent / gbNum).setScale(2, RoundingMode.HALF_UP);
        log.info("內(nèi)存使用率:{}%", memoryUsagePercentDec);

        log.info("===============================磁盤設(shè)備信息===============================");
        List<HWDiskStore> diskStores = hardware.getDiskStores();
        for (HWDiskStore disk : diskStores) {
            String name = disk.getName();

            String model = disk.getModel();
            log.info("磁盤:{},磁盤型號:{}", name, model);

            long size = disk.getSize();
            BigDecimal sizeDec = new BigDecimal(size / gbNum).setScale(2, RoundingMode.HALF_UP);
            log.info("磁盤:{},磁盤大?。簕}GB", name, sizeDec);

            long reads = disk.getReads();
            log.info("磁盤:{},讀取次數(shù):{}", name, reads);

            long readBytes = disk.getReadBytes();
            log.info("磁盤:{},讀取字節(jié)數(shù):{}", name, readBytes);

            long writes = disk.getWrites();
            log.info("磁盤:{},寫入次數(shù):{}", name, writes);

            long writeBytes = disk.getWriteBytes();
            log.info("磁盤:{},寫入字節(jié)數(shù):{}", name, writeBytes);

            long transferTime = disk.getTransferTime();
            log.info("磁盤:{},傳輸時(shí)間:{}", name, transferTime);
        }

        log.info("===============================網(wǎng)絡(luò)接口信息===============================");
        List<NetworkIF> networkIFs = hardware.getNetworkIFs();
        for (NetworkIF net : networkIFs) {
            String name = net.getName();

            String displayName = net.getDisplayName();
            log.info("網(wǎng)絡(luò)接口:{},顯示名稱:{}", name, displayName);

            String mac = net.getMacaddr();
            log.info("網(wǎng)絡(luò)接口:{},MAC地址:{}", name, mac);

            long mtu = net.getMTU();
            log.info("網(wǎng)絡(luò)接口:{},MTU值:{}", name, mtu);

            long speed = net.getSpeed();
            log.info("網(wǎng)絡(luò)接口:{},網(wǎng)卡速度:{}", name, speed);

            String[] ipv4 = net.getIPv4addr();
            log.info("網(wǎng)絡(luò)接口:{},IPv4 地址:{}", name, ipv4);

            String[] ipv6 = net.getIPv6addr();
            log.info("網(wǎng)絡(luò)接口:{},IPv6 地址:{}", name, ipv6);
        }
        // 第一次獲取數(shù)據(jù)
        long bytesRecv = 0L;
        long bytesSent = 0L;
        for (NetworkIF net : networkIFs) {
            net.updateAttributes();
            bytesRecv = net.getBytesRecv();
            bytesSent = net.getBytesSent();
            long packetsRecv = net.getPacketsRecv();
            long packetsSent = net.getPacketsSent();
        }
        // 等待1秒
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        // 第二次獲取并計(jì)算速率
        for (NetworkIF net : networkIFs) {
            net.updateAttributes();
            long newRecv = net.getBytesRecv();
            long newSent = net.getBytesSent();
            // 計(jì)算每秒接收/發(fā)送的字節(jié)數(shù)
            long recvRate = newRecv - bytesRecv;
            long sentRate = newSent - bytesSent;
            log.info("網(wǎng)卡 {} 接收 {} 字節(jié)/秒, 發(fā)送 {} 字節(jié)/秒", net.getName(), recvRate, sentRate);
        }

        log.info("===============================操作系統(tǒng)信息===============================");
        OperatingSystem os = si.getOperatingSystem();

        String family = os.getFamily();
        log.info("操作系統(tǒng) {}", family);

        String manufacturer = os.getManufacturer();
        log.info("操作系統(tǒng)制造商 {}", manufacturer);

        OperatingSystem.OSVersionInfo versionInfo = os.getVersionInfo();
        log.info("操作系統(tǒng)版本 {}", versionInfo.toString());

        long uptime = os.getSystemUptime();
        log.info("系統(tǒng)啟動時(shí)間 {}", uptime);

        int processCount = os.getProcessCount();
        log.info("進(jìn)程數(shù)量 {}", processCount);

        int threadCount = os.getThreadCount();
        log.info("線程數(shù)量 {}", threadCount);

        OSProcess currentProcess = os.getProcess(os.getProcessId());
        log.info("當(dāng)前進(jìn)程 {}", currentProcess.getName());

        long processMemory = currentProcess.getResidentSetSize();
        log.info("進(jìn)程內(nèi)存占用 {}", processMemory);

        double processCpuLoad = currentProcess.getProcessCpuLoadBetweenTicks(currentProcess);
        log.info("進(jìn)程CPU使用率 {}", processCpuLoad);
    }
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java并發(fā)編程之重入鎖與讀寫鎖

    Java并發(fā)編程之重入鎖與讀寫鎖

    這篇文章主要介紹了Java并發(fā)編程之重入鎖與讀寫鎖,文中相關(guān)實(shí)例代碼詳細(xì),測試可用,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • 解決Spring Cloud feign GET請求無法用實(shí)體傳參的問題

    解決Spring Cloud feign GET請求無法用實(shí)體傳參的問題

    這篇文章主要介紹了解決Spring Cloud feign GET請求無法用實(shí)體傳參的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 使用SpringBoot整合Sharding Sphere實(shí)現(xiàn)數(shù)據(jù)脫敏的示例

    使用SpringBoot整合Sharding Sphere實(shí)現(xiàn)數(shù)據(jù)脫敏的示例

    Apache ShardingSphere數(shù)據(jù)脫敏模塊,通過SQL攔截與改寫實(shí)現(xiàn)敏感信息加密存儲,解決手動處理繁瑣及系統(tǒng)改造難題,支持Spring和Spring Boot配置,本文通過實(shí)例代碼介紹如何使用SpringBoot整合Sharding Sphere實(shí)現(xiàn)數(shù)據(jù)脫敏,感興趣的朋友一起看看吧
    2025-06-06
  • 利用java判斷字符串中有漢字?(常用正則表達(dá)式)

    利用java判斷字符串中有漢字?(常用正則表達(dá)式)

    最近工作中遇到了一個(gè)需求,需要利用java獲取字符串中的數(shù)字,嘗試幾種方法后發(fā)現(xiàn)利用正則表達(dá)式實(shí)現(xiàn)最為方便,這篇文章主要給大家介紹了關(guān)于如何利用java判斷字符串中有漢字?的相關(guān)資料,文中還分享了一些常用正則表達(dá)式,需要的朋友可以參考下
    2023-10-10
  • SpringBoot整合OpenCV的實(shí)現(xiàn)示例

    SpringBoot整合OpenCV的實(shí)現(xiàn)示例

    這篇文章主要介紹了SpringBoot整合OpenCV的實(shí)現(xiàn)示例。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Spring之@Aspect中通知的5種方式詳解

    Spring之@Aspect中通知的5種方式詳解

    本文主要介紹了Spring之@Aspect中通知的5種方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • java方法重寫和super關(guān)鍵字實(shí)例詳解

    java方法重寫和super關(guān)鍵字實(shí)例詳解

    這篇文章主要介紹了java方法重寫和super關(guān)鍵字實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • springboot @ComponentScan注解原理解析

    springboot @ComponentScan注解原理解析

    這篇文章主要介紹了springboot @ComponentScan注解原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 關(guān)于弱引用WeakReference所引用的對象的回收規(guī)則

    關(guān)于弱引用WeakReference所引用的對象的回收規(guī)則

    這篇文章主要介紹了關(guān)于弱引用WeakReference所引用的對象的回收規(guī)則,如果一個(gè)弱引用實(shí)例的成員變量referent引用了一個(gè)對象obj,那么就稱這個(gè)弱引用實(shí)例對obj的引用是弱引用,被一個(gè)弱引用實(shí)例引用的對象,稱為弱引用對象,需要的朋友可以參考下
    2023-09-09
  • Java利用構(gòu)建器模式重構(gòu)Excel導(dǎo)出工具類

    Java利用構(gòu)建器模式重構(gòu)Excel導(dǎo)出工具類

    在Java企業(yè)級開發(fā)中,Excel導(dǎo)出功能幾乎成為業(yè)務(wù)系統(tǒng)的標(biāo)準(zhǔn)配置,本文將介紹如何通過構(gòu)建器模式和流暢接口設(shè)計(jì),重構(gòu)Excel導(dǎo)出工具類,實(shí)現(xiàn)API的優(yōu)雅封裝與調(diào)用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-06-06

最新評論

沂源县| 集安市| 大连市| 大城县| 江西省| 黔西| 六枝特区| 织金县| 广平县| 尼玛县| 神农架林区| 中卫市| 邓州市| 南充市| 永平县| 宁城县| 黑河市| 岳阳市| 民县| 凤山县| 什邡市| 曲沃县| 枣庄市| 兴国县| 渝中区| 兰溪市| 婺源县| 云浮市| 上饶县| 永新县| 阿勒泰市| 安吉县| 尚义县| 建水县| 宾阳县| 临海市| 灵台县| 吴川市| 文水县| 乐山市| 兰坪|