java?oshi如何查看cpu信息
oshi查看cpu信息
OSHI可以跨平臺(tái)查看服務(wù)器信息,其中cpu負(fù)載信息為當(dāng)前占用CPU的時(shí)間。需要在一段時(shí)間內(nèi)獲取兩次,然后相減得出這段時(shí)間內(nèi)所占用的時(shí)間。這段時(shí)間除以總占用時(shí)間就是占用百分比。
pom引入依賴
<dependency> ? ? ? <groupId>com.github.oshi</groupId> ? ? ? <artifactId>oshi-core</artifactId> ? ? ? <version>3.12.2</version> </dependency>
測(cè)試類
package io.greatcolin.jvmMessage; import oshi.SystemInfo; import oshi.hardware.CentralProcessor; import oshi.hardware.GlobalMemory; import java.text.DecimalFormat; import java.util.Properties; import java.util.concurrent.TimeUnit; /** * @author colin.cheng * @version V1.0 * @date Created In 16:04 2019/8/16 */ public class OshiTest { public static void main(String[] args) { while (true){ try { OshiTest.printlnCpuInfo(); OshiTest.MemInfo(); OshiTest.getThread(); OshiTest.setSysInfo(); OshiTest.setJvmInfo(); TimeUnit.SECONDS.sleep(5); }catch (Exception e){ e.printStackTrace(); } } } private static void printlnCpuInfo() throws InterruptedException { //System.out.println("----------------cpu信息----------------"); SystemInfo systemInfo = new SystemInfo(); CentralProcessor processor = systemInfo.getHardware().getProcessor(); long[] prevTicks = processor.getSystemCpuLoadTicks(); // 睡眠1s TimeUnit.SECONDS.sleep(1); long[] ticks = processor.getSystemCpuLoadTicks(); long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()]; long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()]; long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal; System.out.println("----------------cpu信息----------------"); System.out.println("cpu核數(shù):" + processor.getLogicalProcessorCount()); System.out.println("cpu系統(tǒng)使用率:" + new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu)); System.out.println("cpu用戶使用率:" + new DecimalFormat("#.##%").format(user * 1.0 / totalCpu)); System.out.println("cpu當(dāng)前等待率:" + new DecimalFormat("#.##%").format(iowait * 1.0 / totalCpu)); System.out.println("cpu當(dāng)前使用率:" + new DecimalFormat("#.##%").format(1.0-(idle * 1.0 / totalCpu))); } public static void MemInfo(){ System.out.println("----------------主機(jī)內(nèi)存信息----------------"); SystemInfo systemInfo = new SystemInfo(); GlobalMemory memory = systemInfo.getHardware().getMemory(); //總內(nèi)存 long totalByte = memory.getTotal(); //剩余 long acaliableByte = memory.getAvailable(); System.out.println("總內(nèi)存 = " + formatByte(totalByte)); System.out.println("使用" + formatByte(totalByte-acaliableByte)); System.out.println("剩余內(nèi)存 = " + formatByte(acaliableByte)); System.out.println("使用率:" + new DecimalFormat("#.##%").format((totalByte-acaliableByte)*1.0/totalByte)); } public static void setSysInfo(){ System.out.println("----------------操作系統(tǒng)信息----------------"); Properties props = System.getProperties(); //系統(tǒng)名稱 String osName = props.getProperty("os.name"); //架構(gòu)名稱 String osArch = props.getProperty("os.arch"); System.out.println("操作系統(tǒng)名 = " + osName); System.out.println("系統(tǒng)架構(gòu) = " + osArch); } public static void setJvmInfo(){ System.out.println("----------------jvm信息----------------"); Properties props = System.getProperties(); Runtime runtime = Runtime.getRuntime(); //jvm總內(nèi)存 long jvmTotalMemoryByte = runtime.totalMemory(); //jvm最大可申請(qǐng) long jvmMaxMoryByte = runtime.maxMemory(); //空閑空間 long freeMemoryByte = runtime.freeMemory(); //jdk版本 String jdkVersion = props.getProperty("java.version"); //jdk路徑 String jdkHome = props.getProperty("java.home"); System.out.println("jvm內(nèi)存總量 = " + formatByte(jvmTotalMemoryByte)); System.out.println("jvm已使用內(nèi)存 = " + formatByte(jvmTotalMemoryByte-freeMemoryByte)); System.out.println("jvm剩余內(nèi)存 = " + formatByte(freeMemoryByte)); System.out.println("jvm內(nèi)存使用率 = " + new DecimalFormat("#.##%").format((jvmTotalMemoryByte-freeMemoryByte)*1.0/jvmTotalMemoryByte)); System.out.println("java版本 = " + jdkVersion); //System.out.println("jdkHome = " + jdkHome); } public static void getThread(){ System.out.println("----------------線程信息----------------"); ThreadGroup currentGroup =Thread.currentThread().getThreadGroup(); while (currentGroup.getParent()!=null){ // 返回此線程組的父線程組 currentGroup=currentGroup.getParent(); } //此線程組中活動(dòng)線程的估計(jì)數(shù) int noThreads = currentGroup.activeCount(); Thread[] lstThreads = new Thread[noThreads]; //把對(duì)此線程組中的所有活動(dòng)子組的引用復(fù)制到指定數(shù)組中。 currentGroup.enumerate(lstThreads); for (Thread thread : lstThreads) { System.out.println("線程數(shù)量:"+noThreads+" 線程id:" + thread.getId() + " 線程名稱:" + thread.getName() + " 線程狀態(tài):" + thread.getState()); } } public static String formatByte(long byteNumber){ //換算單位 double FORMAT = 1024.0; double kbNumber = byteNumber/FORMAT; if(kbNumber<FORMAT){ return new DecimalFormat("#.##KB").format(kbNumber); } double mbNumber = kbNumber/FORMAT; if(mbNumber<FORMAT){ return new DecimalFormat("#.##MB").format(mbNumber); } double gbNumber = mbNumber/FORMAT; if(gbNumber<FORMAT){ return new DecimalFormat("#.##GB").format(gbNumber); } double tbNumber = gbNumber/FORMAT; return new DecimalFormat("#.##TB").format(tbNumber); } }
輸出結(jié)果
# 沒添加slf4j的依賴,不影響
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
----------------cpu信息----------------
cpu核數(shù):4
cpu系統(tǒng)使用率:1.88%
cpu用戶使用率:2.73%
cpu當(dāng)前等待率:0%
cpu當(dāng)前使用率:4.71%
----------------主機(jī)內(nèi)存信息----------------
總內(nèi)存 = 7.88GB
使用5.89GB
剩余內(nèi)存 = 1.99GB
使用率:74.72%
----------------線程信息----------------
線程數(shù)量:5 線程id:2 線程名稱:Reference Handler 線程狀態(tài):WAITING
線程數(shù)量:5 線程id:3 線程名稱:Finalizer 線程狀態(tài):WAITING
線程數(shù)量:5 線程id:4 線程名稱:Signal Dispatcher 線程狀態(tài):RUNNABLE
線程數(shù)量:5 線程id:5 線程名稱:Attach Listener 線程狀態(tài):RUNNABLE
線程數(shù)量:5 線程id:1 線程名稱:main 線程狀態(tài):RUNNABLE
----------------操作系統(tǒng)信息----------------
操作系統(tǒng)名 = Windows 7
系統(tǒng)架構(gòu) = amd64
----------------jvm信息----------------
jvm內(nèi)存總量 = 123MB
jvm已使用內(nèi)存 = 20.46MB
jvm剩余內(nèi)存 = 102.54MB
jvm內(nèi)存使用率 = 16.64%
java版本 = 1.8.0_65
oshi獲取cpu/內(nèi)存使用率前十的進(jìn)程
CPU
@Override public void getFirstCpuUsed() { ? ? OperatingSystem windowsOperatingSystem = new WindowsOperatingSystem(); ? ? List<OSProcess> processList = windowsOperatingSystem.getProcesses(10, OperatingSystem.ProcessSort.CPU); ? ? for (OSProcess process : processList) { ? ? ? ? //進(jìn)程名,進(jìn)程ID,進(jìn)程CPU使用率 ? ? ? ? System.out.println(String.format("name:%s PID: %d CPU:%.3f", ? ? ? ? ? ? ? ? process.getName(),process.getProcessID(), ? ? ? ? ? ? ? ? process.getProcessCpuLoadCumulative())); ? ? } }
內(nèi)存
public void getFirstMemUsed(){ ? ? OperatingSystem windowsOperatingSystem = new WindowsOperatingSystem(); ? ? List<OSProcess> processList = windowsOperatingSystem.getProcesses(10, OperatingSystem.ProcessSort.MEMORY); ? ? for (OSProcess process : processList) { ? ? ? ? //進(jìn)程名,京城ID,進(jìn)程CPU使用率 ? ? ? ? System.out.println(String.format("name:%s PID: %d CPU:%.3f", ? ? ? ? ? ? ? ? process.getName(),process.getProcessID(), ? ? ? ? ? ? ? ? process.getProcessCpuLoadCumulative())); ? ? } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SSM框架下如何實(shí)現(xiàn)數(shù)據(jù)從后臺(tái)傳輸?shù)角芭_(tái)
這篇文章主要介紹了SSM框架下如何實(shí)現(xiàn)數(shù)據(jù)從后臺(tái)傳輸?shù)角芭_(tái),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05Java實(shí)現(xiàn)常見排序算法的優(yōu)化
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java實(shí)現(xiàn)常見排序算法的優(yōu)化展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-01-01springboot獲取URL請(qǐng)求參數(shù)的多種方式
這篇文章主要介紹了springboot獲取URL請(qǐng)求參數(shù)的多種方式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01Java多線程實(shí)現(xiàn)之Callable詳解
這篇文章主要介紹了Java多線程實(shí)現(xiàn)之Callable詳解,Callable是一個(gè)接口,用于實(shí)現(xiàn)多線程,與實(shí)現(xiàn)Runnable類似,但是功能更強(qiáng)大,通過實(shí)現(xiàn)Callable接口,我們需要重寫call()方法,該方法可以在任務(wù)結(jié)束后提供一個(gè)返回值,需要的朋友可以參考下2023-08-08JAVA實(shí)現(xiàn)較完善的布隆過濾器的示例代碼
這篇文章主要介紹了JAVA實(shí)現(xiàn)較完善的布隆過濾器的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10