java获得CPU使用率,系统内存,虚拟…

程序计算时间:

longstartTime=System.currentTimeMillis();    //获取开始时间

。。。。。。。。。。。。
long endTime=System.currentTimeMillis(); //获取结束时间

System.out.println("程序运行时间: "+(endTime-startTime)+"ms(毫秒)");






  利用java程序实现获取计算机cpu利用率和内存使用信息。   
 
      创建一个Bean用来存贮要得到的信   
 
public class MonitorInfoBean {   
         
      private longtotalMemory;   
       
         
      private longfreeMemory;   
       
         
      private longmaxMemory;   
       
         
      privateString osName;   
       
         
      private longtotalMemorySize;   
       
         
      private longfreePhysicalMemorySize;   
       
         
      private longusedMemory;   
       
         
      private inttotalThread;   
       
         
      privatedouble cpuRatio;   
 
      public longgetFreeMemory() {   
              return freeMemory;   
       
 
      public voidsetFreeMemory(long freeMemory) {   
              this.freeMemory = freeMemory;   
       
 
      public longgetFreePhysicalMemorySiz e() {   
              return freePhysicalMemorySize;   
       
 
      public voidsetFreePhysicalMemorySiz e(long freePhysicalMemorySize){   
              this.freePhysicalMemorySize =freePhysicalMemorySize;   
       
 
      public longgetMaxMemory() {   
              return maxMemory;   
       
 
      public voidsetMaxMemory(long maxMemory) {   
              this.maxMemory = maxMemory;   
       
 
      publicString getOsName() {   
              return osName;   
       
 
      public voidsetOsName(String osName) {   
              this.osName = osName;   
       
 
      public longgetTotalMemory() {   
              return totalMemory;   
       
 
      public voidsetTotalMemory(long totalMemory) {   
              this.totalMemory = totalMemory;   
       
 
      public longgetTotalMemorySize() {   
              return totalMemorySize;   
       
 
      public voidsetTotalMemorySize(long totalMemorySize) {   
              this.totalMemorySize = totalMemorySize;   
       
 
      public intgetTotalThread() {   
              return totalThread;   
       
 
      public voidsetTotalThread(int totalThread) {   
              this.totalThread = totalThread;   
       
 
      public longgetUsedMemory() {   
              return usedMemory;   
       
 
      public voidsetUsedMemory(long usedMemory) {   
              this.usedMemory = usedMemory;   
       
 
      publicdouble getCpuRatio() {   
              return cpuRatio;   
       
 
      public voidsetCpuRatio(double cpuRatio) {   
              this.cpuRatio = cpuRatio;   
       
 
 
      之后,建立bean的接口   
 
public interface IMonitorService {   
      publicMonitorInfoBean getMonitorInfoBean() throwsException;   
 
 
 
  然后,就是最关键的,得到cpu的利用率,已用内存,可用内存,最大内存等信息。   
 
import java.io.InputStreamReader;   
import java.io.LineNumberReader;   
 
import sun.management.ManagementFactory;   
 
import com.sun.management.OperatingSystemMXBean;   
import java.io.*;   
import java.util.StringTokenizer;   
 
   
public class MonitorServiceImpl implements IMonitorService{   
       
      privatestatic final int CPUTIME = 30;   
 
      privatestatic final int PERCENT = 100;   
 
      privatestatic final int FAULTLENGTH = 10;   
       
      privatestatic final File versionFile = newFile("/proc/version");   
      privatestatic String linuxVersion = null;   
 
         
      publicMonitorInfoBean getMonitorInfoBean() throws Exception{   
              int kb = 1024;   
               
              // 可使用内存   
              long totalMemory = Runtime.getRuntime().totalMemory() /kb;   
              // 剩余内存   
              long freeMemory = Runtime.getRuntime().freeMemory() /kb;   
              // 最大可使用内存   
              long maxMemory = Runtime.getRuntime().maxMemory() /kb;   
 
              OperatingSystemMXBean osmxb = (OperatingSystemMXBean)ManagementFactory   
                              .getOperatingSystemMXBean ();   
 
              // 操作系统   
              String osName = System.getProperty("os.name");   
              // 总的物理内存   
              long totalMemorySize = osmxb.getTotalPhysicalMemorySi ze() /kb;   
              // 剩余的物理内存   
              long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySiz e() /kb;   
              // 已使用的物理内存   
              long usedMemory = (osmxb.getTotalPhysicalMemorySi ze() -osmxb   
                              .getFreePhysicalMemorySiz e())   
                              / kb;   
 
              // 获得线程总数   
              ThreadGroup parentThread;   
              for (parentThread = Thread.currentThread().getThreadGroup();parentThread   
                              .getParent() != null; parentThread =parentThread.getParent())   
                       
              int totalThread = parentThread.activeCount();   
 
              double cpuRatio = 0;   
              if (osName.toLowerCase().startsWith("windows")) {   
                      cpuRatio = this.getCpuRatioForWindows();   
               
              else {   
                cpuRatio = this.getCpuRateForLinux();   
               
               
              // 构造返回对象   
              MonitorInfoBean infoBean = new MonitorInfoBean();   
              infoBean.setFreeMemory(freeMemory);   
              infoBean.setFreePhysicalMemorySiz e(freePhysicalMemorySize);   
              infoBean.setMaxMemory(maxMemory);   
              infoBean.setOsName(osName);   
              infoBean.setTotalMemory(totalMemory);   
              infoBean.setTotalMemorySize(totalMemorySize);   
              infoBean.setTotalThread(totalThread);   
              infoBean.setUsedMemory(usedMemory);   
              infoBean.setCpuRatio(cpuRatio);   
              return infoBean;   
       
      privatestatic double getCpuRateForLinux(){   
              InputStream is = null;   
              InputStreamReader isr = null;   
              BufferedReader brStat = null;   
              StringTokenizer tokenStat = null;   
              try{   
                      System.out.println("Get usage rate of CUP , linux version:"+linuxVersion);   
 
                      Process process = Runtime.getRuntime().exec("top -b -n1");   
                      is =process.getInputStream();                                       
                      isr = new InputStreamReader(is);   
                      brStat = new BufferedReader(isr);   
                       
                      if(linuxVersion.equals("2.4")){   
                              brStat.readLine();   
                              brStat.readLine();   
                              brStat.readLine();   
                              brStat.readLine();   
                               
                              tokenStat = newStringTokenizer(brStat.readLine());   
                              tokenStat.nextToken();   
                              tokenStat.nextToken();   
                              String user = tokenStat.nextToken();   
                              tokenStat.nextToken();   
                              String system = tokenStat.nextToken();   
                              tokenStat.nextToken();   
                              String nice = tokenStat.nextToken();   
                               
                              System.out.println(user+" , "+system+" , "+nice);   
                               
                              user = user.substring(0,user.indexOf("%"));   
                              system = system.substring(0,system.indexOf("%"));   
                              nice = nice.substring(0,nice.indexOf("%"));   
                               
                              float userUsage = new Float(user).floatValue();   
                              float systemUsage = newFloat(system).floatValue();   
                              float niceUsage = new Float(nice).floatValue();   
                               
                              return (userUsage+systemUsage+niceUsage)/100;   
                      }else{   
                              brStat.readLine();   
                              brStat.readLine();   
                                       
                              tokenStat = newStringTokenizer(brStat.readLine());   
                              tokenStat.nextToken();   
                              tokenStat.nextToken();   
                              tokenStat.nextToken();   
                              tokenStat.nextToken();   
                              tokenStat.nextToken();   
                              tokenStat.nextToken();   
                              tokenStat.nextToken();   
                              String cpuUsage = tokenStat.nextToken();   
                                       
                               
                              System.out.println("CPU idle : "+cpuUsage);   
                              Float usage = newFloat(cpuUsage.substring(0,cpuUsage.indexOf("%")));   
                               
                              return (1-usage.floatValue()/100);   
                       
 
                         
              } catch(IOException ioe){   
                      System.out.println(ioe.getMessage());   
                      freeResource(is, isr, brStat);   
                      return 1;   
              } finally{   
                      freeResource(is, isr, brStat);   
               
 
       
      privatestatic void freeResource(InputStream is, InputStreamReader isr,BufferedReader br){   
              try{   
                      if(is!=null)   
                              is.close();   
                      if(isr!=null)   
                              isr.close();   
                      if(br!=null)   
                              br.close();   
              }catch(IOException ioe){   
                      System.out.println(ioe.getMessage());   
               
       
 
 
         
      privatedouble getCpuRatioForWindows() {   
              try {   
                      String procCmd = System.getenv("windir")   
                                      + "\\system32\\wbem\\wmic.exe process getCaption,CommandLine,"   
                                      +"KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";   
                      // 取进程信息   
                      long[] c0 =readCpu(Runtime.getRuntime().exec(procCmd));   
                      Thread.sleep(CPUTIME);   
                      long[] c1 =readCpu(Runtime.getRuntime().exec(procCmd));   
                      if (c0 != null && c1 !=null) {   
                              long idletime = c1[0] - c0[0];   
                              long busytime = c1[1] - c0[1];   
                              return Double.valueOf(   
                                              PERCENT * (busytime) / (busytime + idletime))   
                                              .doubleValue();   
                      } else {   
                              return 0.0;   
                       
              } catch (Exception ex) {   
                      ex.printStackTrace();   
                      return 0.0;   
               
       
 
         
      privatelong[] readCpu(final Process proc) {   
              long[] retn = new long[2];   
              try {   
                      proc.getOutputStream().close();   
                      InputStreamReader ir = newInputStreamReader(proc.getInputStream());   
                      LineNumberReader input = newLineNumberReader(ir);   
                      String line = input.readLine();   
                      if (line == null || line.length() < FAULTLENGTH){   
                              return null;   
                       
                      int capidx = line.indexOf("Caption");   
                      int cmdidx = line.indexOf("CommandLine");   
                      int rocidx = line.indexOf("ReadOperationCount");   
                      int umtidx = line.indexOf("UserModeTime");   
                      int kmtidx = line.indexOf("KernelModeTime");   
                      int wocidx = line.indexOf("WriteOperationCount");   
                      long idletime = 0;   
                      long kneltime = 0;   
                      long usertime = 0;   
                      while ((line = input.readLine()) != null) {   
                              if (line.length() < wocidx) {   
                                      continue;   
                               
                              //字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount,   
                              // ThreadCount,UserModeTime,WriteOperation   
                              String caption = Bytes.substring(line, capidx, cmdidx -1)   
                                              .trim();   
                              String cmd = Bytes.substring(line, cmdidx, kmtidx -1).trim();   
                              if (cmd.indexOf("wmic.exe") >= 0){   
                                      continue;   
                               
                              // log.info("line="+line);   
                              if (caption.equals("System Idle Process")   
                                              || caption.equals("System")) {   
                                      idletime += Long.valueOf(   
                                                      Bytes.substring(line, kmtidx, rocidx - 1).trim())   
                                                      .longValue();   
                                      idletime += Long.valueOf(   
                                                      Bytes.substring(line, umtidx, wocidx - 1).trim())   
                                                      .longValue();   
                                      continue;   
                               
 
                              kneltime += Long.valueOf(   
                                              Bytes.substring(line, kmtidx, rocidx - 1).trim())   
                                              .longValue();   
                              usertime += Long.valueOf(   
                                              Bytes.substring(line, umtidx, wocidx - 1).trim())   
                                              .longValue();   
                       
                      retn[0] = idletime;   
                      retn[1] = kneltime + usertime;   
                      return retn;   
              } catch (Exception ex) {   
                      ex.printStackTrace();   
              } finally {   
                      try {   
                              proc.getInputStream().close();   
                      } catch (Exception e) {   
                              e.printStackTrace();   
                       
               
              return null;   
       
       
         
      publicstatic void main(String[] args) throws Exception{   
              IMonitorService service = newMonitorServiceImpl();   
              MonitorInfoBean monitorInfo =service.getMonitorInfoBean();   
              System.out.println("cpu占有率=" +monitorInfo.getCpuRatio());   
               
              System.out.println("可使用内存=" +monitorInfo.getTotalMemory());   
              System.out.println("剩余内存=" +monitorInfo.getFreeMemory());   
              System.out.println("最大可使用内存=" +monitorInfo.getMaxMemory());   
               
              System.out.println("操作系统=" +monitorInfo.getOsName());   
              System.out.println("总的物理内存=" + monitorInfo.getTotalMemorySize() +"kb");   
              System.out.println("剩余的物理内存=" + monitorInfo.getFreeMemory() +"kb");   
              System.out.println("已使用的物理内存=" + monitorInfo.getUsedMemory() +"kb");   
              System.out.println("线程总数=" + monitorInfo.getTotalThread() +"kb");   
       
 
 
      其中,Bytes类用来处理字符串   
 
    public class Bytes{   
      publicstatic String substring(String src, int start_idx, intend_idx){   
              byte[] b = src.getBytes();   
              String tgt = "";   
              for(int i=start_idx; i<=end_idx;i++){   
                      tgt +=(char)b[i];   
               
              return tgt;   
       

Java libvirt是一个用于管理虚拟化平台(例如KVM、Xen、VMware等)的库。你可以使用它来获取虚拟机状态、网络流量、CPU使用率内存使用、磁盘大小数据。以下是一个简单的Java代码示例,演示如何使用libvirt获取虚拟机信息: ```java import org.libvirt.*; public class VMInfo { public static void main(String[] args) throws Exception { Connect conn = new Connect("qemu:///system", false); Domain domain = conn.domainLookupByName("vm-name"); // 获取虚拟机状态 int state = domain.getInfo().state; System.out.println("VM State: " + DomainState.stateToString(state)); // 获取网络流量 long rxBytes = domain.interfaceStats("vnet0").rx_bytes; long txBytes = domain.interfaceStats("vnet0").tx_bytes; System.out.println("RX Bytes: " + rxBytes + ", TX Bytes: " + txBytes); // 获取CPU使用率 int ncpus = domain.getInfo().nrVirtCpu; long[] cpuTimeStart = domain.getCPUStats(-1); Thread.sleep(1000); long[] cpuTimeEnd = domain.getCPUStats(-1); double cpuUsage = 0; for (int i = 0; i < ncpus; i++) { cpuUsage += (double) (cpuTimeEnd[i] - cpuTimeStart[i]) / 10000000; } cpuUsage /= ncpus; System.out.println("CPU Usage: " + cpuUsage + "%"); // 获取内存使用 long memoryUsage = domain.memoryStats().get("actual").getValue(); System.out.println("Memory Usage: " + memoryUsage + " bytes"); // 获取磁盘大小 long diskCapacity = domain.blockInfo("/dev/sda").capacity; System.out.println("Disk Capacity: " + diskCapacity + " bytes"); domain.free(); conn.close(); } } ``` 在本示例中,我们使用`Connect`类创建了一个到本地虚拟化环境的连接。然后,使用`domainLookupByName()`方法查找特定名称的虚拟机,并使用`getInfo()`方法获取其状态信息。接下来,我们使用`interfaceStats()`方法获取虚拟机的网络流量,使用`getCPUStats()`方法获取虚拟机的CPU使用率,使用`memoryStats()`方法获取虚拟机的内存使用情况,使用`blockInfo()`方法获取虚拟机的磁盘信息。最后,我们释放了资源并关闭了连接。 请注意,这只是一个简单的示例,实际应用程序可能需要更多的错误处理和适当的资源管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值