2015-01-20 31 views
2

Java 프로그램을 통해 몇 가지 시스템 통계 (CPU 사용률, 디스크 사용률 및 메모리 사용률 %)를 찾으려고합니다. 이 목적을 위해 나는 SIGAR를 사용 해왔다. 후자의 두 개를 올바르게 수정하고 있지만 CPU 사용률이 정확하지 않습니다. 아래에 내 코드를 추가하면 누군가가 내가 무엇이 잘못되었는지 이해할 수있게 도와 줄 수 있습니까?Sigar를 사용하여 Java에서 전체 CPU 사용률을 찾는 방법

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.lang.*; 

import org.hyperic.sigar.CpuTimer; 
import org.hyperic.sigar.DiskUsage; 
import org.hyperic.sigar.FileSystemUsage; 
import org.hyperic.sigar.Mem; 
import org.hyperic.sigar.Sigar; 
import org.hyperic.sigar.SigarException; 




public class SystemMonitor { 

    private static Sigar sigar = new Sigar(); 

    public static void getSystemStatistics(){ 
     Mem mem = null; 
     CpuTimer cputimer = null; 
     FileSystemUsage filesystemusage = null; 
     try { 
      mem = sigar.getMem(); 
      cputimer = new CpuTimer(sigar); 
      filesystemusage = sigar.getFileSystemUsage("C:");   
     } catch (SigarException se) { 
      se.printStackTrace(); 
     } 


     System.out.print(mem.getUsedPercent()+"\t"); 
     System.out.print(cputimer.getCpuUsage()+"\t"); 
     System.out.print(filesystemusage.getUsePercent()+"\n"); 

    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     SystemMonitor m1 = new SystemMonitor(); 
     for(int i=0; i<1000;i++){ 
     m1.getSystemStatistics(); 
     } 
    } 




} 

지속적으로 CPUUtilisation % 0이 발생합니다. 이는 잘못된 것 같습니다.

답변

3

나는 CpuTimer를 잘못 해석하고있었습니다. 대신 CpuPerc을 사용하여 CPU 사용률을 확인할 수 있습니다. 코드 스 니펫 추가 :

public static void getSystemStatistics(){ 
    Mem mem = null; 
    CpuPerc cpuperc = null; 
    FileSystemUsage filesystemusage = null; 
    try { 
     mem = sigar.getMem(); 
     cpuperc = sigar.getCpuPerc(); 
     filesystemusage = sigar.getFileSystemUsage("C:");   
    } catch (SigarException se) { 
     se.printStackTrace(); 
    } 


    System.out.print(mem.getUsedPercent()+"\t"); 
    System.out.print((cpuperc.getCombined()*100)+"\t"); 
    System.out.print(filesystemusage.getUsePercent()+"\n"); 
} 
1

방금 ​​이런 식으로 글을 썼는데 멋지게 볼 수 있으며 코드에 필요한 것을 찾을 수 있습니다. 참고 : 스레드를 시작하는 것을 잊지 마세요 ^^

thread = new Thread(new Runnable() { 
            public void run() { 
             while (true) { 
              /* 
              * Memory of System 
              */ 
              long actualFree = mem.getActualFree()/1024 
                /1024; 
              long actualUsed = mem.getActualUsed()/1024 
                /1024; 
              long per1Mem = (actualFree + actualUsed)/100; 
              system.out.println((((int) actualFree/per1Mem) * 1.0)/100); 
              /* 
              * Disk Space 
              */ 
              File file = new File("/"); 
              long totalSpace = file.getTotalSpace()/1024/1024; 
              long freeSpace = file.getUsableSpace()/1024/1024; 
              long per1Disk = totalSpace/100; 
              system.out.println(((int) freeSpace/per1Disk) * 1.0)/100); 
              /* 
              * CPU USAGE 
              */ 
              try { 
               thread.sleep(1000); //needed for finding proper cpu usage 
               CpuPerc perc = sigar.getCpuPerc(); 
               system.out.println(perc.getCombined()); 
              } catch (SigarException | InterruptedException e) { 
               System.out.println("SigarException in CPU or InterruptedException!"); 
              } 

             } 
            } 
           });