java oshi如何查看cpu信息

作者:占星安啦 时间:2023-01-06 21:16:39 

oshi查看cpu信息

OSHI可以跨平台查看服务器信息,其中cpu负载信息为当前占用CPU的时间。需要在一段时间内获取两次,然后相减得出这段时间内所占用的时间。这段时间除以总占用时间就是占用百分比。

pom引入依赖

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

测试类

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核数:" + processor.getLogicalProcessorCount());
       System.out.println("cpu系统使用率:" + new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu));
       System.out.println("cpu用户使用率:" + new DecimalFormat("#.##%").format(user * 1.0 / totalCpu));
       System.out.println("cpu当前等待率:" + new DecimalFormat("#.##%").format(iowait * 1.0 / totalCpu));
       System.out.println("cpu当前使用率:" + new DecimalFormat("#.##%").format(1.0-(idle * 1.0 / totalCpu)));
   }

public static void MemInfo(){
       System.out.println("----------------主机内存信息----------------");
       SystemInfo systemInfo = new SystemInfo();
       GlobalMemory memory = systemInfo.getHardware().getMemory();
       //总内存
       long totalByte = memory.getTotal();
       //剩余
       long acaliableByte = memory.getAvailable();
       System.out.println("总内存 = " + formatByte(totalByte));
       System.out.println("使用" + formatByte(totalByte-acaliableByte));
       System.out.println("剩余内存 = " + formatByte(acaliableByte));
       System.out.println("使用率:" + new DecimalFormat("#.##%").format((totalByte-acaliableByte)*1.0/totalByte));
   }

public static void setSysInfo(){
       System.out.println("----------------操作系统信息----------------");
       Properties props = System.getProperties();
       //系统名称
       String osName = props.getProperty("os.name");
       //架构名称
       String osArch = props.getProperty("os.arch");
       System.out.println("操作系统名 = " + osName);
       System.out.println("系统架构 = " + osArch);
   }

public static void setJvmInfo(){
       System.out.println("----------------jvm信息----------------");
       Properties props = System.getProperties();
       Runtime runtime = Runtime.getRuntime();
       //jvm总内存
       long jvmTotalMemoryByte = runtime.totalMemory();
       //jvm最大可申请
       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内存总量 = " + formatByte(jvmTotalMemoryByte));
       System.out.println("jvm已使用内存 = " + formatByte(jvmTotalMemoryByte-freeMemoryByte));
       System.out.println("jvm剩余内存 = " + formatByte(freeMemoryByte));
       System.out.println("jvm内存使用率 = " + 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();
       }
       //此线程组中活动线程的估计数
       int noThreads = currentGroup.activeCount();

Thread[] lstThreads = new Thread[noThreads];
       //把对此线程组中的所有活动子组的引用复制到指定数组中。
       currentGroup.enumerate(lstThreads);
       for (Thread thread : lstThreads) {
         System.out.println("线程数量:"+noThreads+" 线程id:" + thread.getId() + " 线程名称:" + thread.getName() + " 线程状态:" + 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);
   }
}

输出结果

# 没添加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核数:4
cpu系统使用率:1.88%
cpu用户使用率:2.73%
cpu当前等待率:0%
cpu当前使用率:4.71%
----------------主机内存信息----------------
总内存 = 7.88GB
使用5.89GB
剩余内存 = 1.99GB
使用率:74.72%
----------------线程信息----------------
线程数量:5 线程id:2 线程名称:Reference Handler 线程状态:WAITING
线程数量:5 线程id:3 线程名称:Finalizer 线程状态:WAITING
线程数量:5 线程id:4 线程名称:Signal Dispatcher 线程状态:RUNNABLE
线程数量:5 线程id:5 线程名称:Attach Listener 线程状态:RUNNABLE
线程数量:5 线程id:1 线程名称:main 线程状态:RUNNABLE
----------------操作系统信息----------------
操作系统名 = Windows 7
系统架构 = amd64
----------------jvm信息----------------
jvm内存总量 = 123MB
jvm已使用内存 = 20.46MB
jvm剩余内存 = 102.54MB
jvm内存使用率 = 16.64%
java版本 = 1.8.0_65

oshi获取cpu/内存使用率前十的进程

CPU

@Override
public void getFirstCpuUsed() {
    OperatingSystem windowsOperatingSystem = new WindowsOperatingSystem();
    List<OSProcess> processList = windowsOperatingSystem.getProcesses(10, OperatingSystem.ProcessSort.CPU);
    for (OSProcess process : processList) {
        //进程名,进程ID,进程CPU使用率
        System.out.println(String.format("name:%s PID: %d CPU:%.3f",
                process.getName(),process.getProcessID(),
                process.getProcessCpuLoadCumulative()));
    }
}

内存

public void getFirstMemUsed(){
    OperatingSystem windowsOperatingSystem = new WindowsOperatingSystem();
    List<OSProcess> processList = windowsOperatingSystem.getProcesses(10, OperatingSystem.ProcessSort.MEMORY);
    for (OSProcess process : processList) {
        //进程名,京城ID,进程CPU使用率
        System.out.println(String.format("name:%s PID: %d CPU:%.3f",
                process.getName(),process.getProcessID(),
                process.getProcessCpuLoadCumulative()));
    }
}

来源:https://blog.csdn.net/u012796085/article/details/104068769

标签:java,oshi,cpu
0
投稿

猜你喜欢

  • Android用tabhost实现 界面切换,每个界面为一个独立的activity操作

    2021-11-09 11:22:26
  • Java详细讲解不同版本的接口语法和抽象类与接口的区别

    2022-09-30 01:46:38
  • C# double和decimal数据类型以截断的方式保留指定的小数位数

    2021-12-09 02:19:04
  • Spring MVC接口防数据篡改和重复提交

    2023-11-29 15:02:11
  • java 配置MyEclipse Maven环境具体实现步骤

    2021-07-31 04:12:23
  • Java中自动生成构造方法详解

    2023-06-21 14:17:44
  • java实现excel和txt文件互转

    2023-10-07 23:04:05
  • 带着问题读CLR via C#(笔记二)类型基础

    2022-01-31 07:31:08
  • Java用三元运算符判断奇数和偶数的简单实现

    2023-07-24 16:54:03
  • java gui详解贪吃蛇小游戏实现流程

    2023-10-08 07:12:24
  • Java多线程编程中ThreadLocal类的用法及深入

    2022-03-17 03:21:29
  • c#3.0实现延迟赋值示例

    2023-01-04 16:28:51
  • SpringDataElasticsearch与SpEL表达式实现ES动态索引

    2021-11-27 01:33:03
  • flutter升级3.7.3报错Unable to find bundled Java version解决

    2023-07-29 16:57:52
  • Android自定义ProgressDialog加载图片

    2022-07-28 22:08:39
  • Android中使用开源框架eventbus3.0实现fragment之间的通信交互

    2021-06-30 09:23:07
  • 关于Java中增强for循环使用的注意事项

    2021-08-09 16:47:43
  • Android 实现代码混淆的实例

    2023-06-01 22:13:48
  • Android中判断网络是否连接实例详解

    2023-10-19 11:45:39
  • SpringMVC实现文件上传与下载

    2021-11-02 11:53:38
  • asp之家 软件编程 m.aspxhome.com