2012-06-12 22 views
5

我發現這篇較舊的文章how-to-monitor-the-computers-cpu-memory-and-disk-usage-in-java 並希望問,如果在Java 7中有新的東西。我想獲得當前的CPU,RAM和netzwork-定期使用我的應用程序。它必須爲linux(mac)和windows工作。數據不能非常詳細,3個值就足夠了(cpu:10%,ram 4%,network 40%)。如果數據僅用於應用程序而不是整個os系統,那將會很酷,但是這也可以工作。如何獲得CPU,RAM和網絡 - Java7應用程序的使用

感謝的幫助

回答

15

回答我自己的問題; P我寫了一些代碼...

NetworkData:

public class NetworkData { 

    static Map<String, Long> rxCurrentMap = new HashMap<String, Long>(); 
    static Map<String, List<Long>> rxChangeMap = new HashMap<String, List<Long>>(); 
    static Map<String, Long> txCurrentMap = new HashMap<String, Long>(); 
    static Map<String, List<Long>> txChangeMap = new HashMap<String, List<Long>>(); 
    private static Sigar sigar; 

    /** 
    * @throws InterruptedException 
    * @throws SigarException 
    * 
    */ 
    public NetworkData(Sigar s) throws SigarException, InterruptedException { 
     sigar = s; 
     getMetric(); 
     System.out.println(networkInfo()); 
     Thread.sleep(1000);  
    } 

    public static void main(String[] args) throws SigarException, 
      InterruptedException { 
     new NetworkData(new Sigar()); 
     NetworkData.startMetricTest(); 
    } 

    public static String networkInfo() throws SigarException { 
     String info = sigar.getNetInfo().toString(); 
     info += "\n"+ sigar.getNetInterfaceConfig().toString(); 
     return info; 
    } 

    public static String getDefaultGateway() throws SigarException { 
     return sigar.getNetInfo().getDefaultGateway(); 
    } 

    public static void startMetricTest() throws SigarException, InterruptedException { 
     while (true) { 
      Long[] m = getMetric(); 
      long totalrx = m[0]; 
      long totaltx = m[1]; 
      System.out.print("totalrx(download): "); 
      System.out.println("\t" + Sigar.formatSize(totalrx)); 
      System.out.print("totaltx(upload): "); 
      System.out.println("\t" + Sigar.formatSize(totaltx)); 
      System.out.println("-----------------------------------"); 
      Thread.sleep(1000); 
     } 

    } 

    public static Long[] getMetric() throws SigarException { 
     for (String ni : sigar.getNetInterfaceList()) { 
      // System.out.println(ni); 
      NetInterfaceStat netStat = sigar.getNetInterfaceStat(ni); 
      NetInterfaceConfig ifConfig = sigar.getNetInterfaceConfig(ni); 
      String hwaddr = null; 
      if (!NetFlags.NULL_HWADDR.equals(ifConfig.getHwaddr())) { 
       hwaddr = ifConfig.getHwaddr(); 
      } 
      if (hwaddr != null) { 
       long rxCurrenttmp = netStat.getRxBytes(); 
       saveChange(rxCurrentMap, rxChangeMap, hwaddr, rxCurrenttmp, ni); 
       long txCurrenttmp = netStat.getTxBytes(); 
       saveChange(txCurrentMap, txChangeMap, hwaddr, txCurrenttmp, ni); 
      } 
     } 
     long totalrxDown = getMetricData(rxChangeMap); 
     long totaltxUp = getMetricData(txChangeMap); 
     for (List<Long> l : rxChangeMap.values()) 
      l.clear(); 
     for (List<Long> l : txChangeMap.values()) 
      l.clear(); 
     return new Long[] { totalrxDown, totaltxUp }; 
    } 

    private static long getMetricData(Map<String, List<Long>> rxChangeMap) { 
     long total = 0; 
     for (Entry<String, List<Long>> entry : rxChangeMap.entrySet()) { 
      int average = 0; 
      for (Long l : entry.getValue()) { 
       average += l; 
      } 
      total += average/entry.getValue().size(); 
     } 
     return total; 
    } 

    private static void saveChange(Map<String, Long> currentMap, 
      Map<String, List<Long>> changeMap, String hwaddr, long current, 
      String ni) { 
     Long oldCurrent = currentMap.get(ni); 
     if (oldCurrent != null) { 
      List<Long> list = changeMap.get(hwaddr); 
      if (list == null) { 
       list = new LinkedList<Long>(); 
       changeMap.put(hwaddr, list); 
      } 
      list.add((current - oldCurrent)); 
     } 
     currentMap.put(ni, current); 
    } 

} 

CPU-數據:

public class CpuData { 
    private static Sigar sigar; 

    public CpuData(Sigar s) throws SigarException { 
     sigar = s; 
     System.out.println(cpuInfo()); 
    } 

    public static void main(String[] args) throws InterruptedException, SigarException { 
     new CpuData(new Sigar()); 
     CpuData.startMetricTest(); 
    } 

    private static void startMetricTest() throws InterruptedException, SigarException { 
     new Thread() { 
      public void run() { 
       while(true) 
       BigInteger.probablePrime(MAX_PRIORITY, new Random()); 
      }; 
     }.start(); 
     while(true) { 
      String pid = ""+sigar.getPid(); 
      System.out.print(getMetric(pid)); 
      for(Double d:getMetric()){ 
       System.out.print("\t"+d); 
      } 
      System.out.println(); 
      Thread.sleep(1000); 
     }  
    } 

    public String cpuInfo() throws SigarException { 
     CpuInfo[] infos = sigar.getCpuInfoList(); 
     CpuInfo info = infos[0]; 

     String infoString = info.toString(); 
     if ((info.getTotalCores() != info.getTotalSockets()) 
       || (info.getCoresPerSocket() > info.getTotalCores())) { 
      infoString+=" Physical CPUs: " + info.getTotalSockets(); 
      infoString+=" Cores per CPU: " + info.getCoresPerSocket(); 
     } 

     long cacheSize = info.getCacheSize(); 
     if (cacheSize != Sigar.FIELD_NOTIMPL) { 
      infoString+="Cache size...." + cacheSize; 
     } 
     return infoString; 
    } 

    public static Double[] getMetric() throws SigarException { 
     CpuPerc cpu = sigar.getCpuPerc(); 
     double system = cpu.getSys(); 
     double user = cpu.getUser(); 
     double idle = cpu.getIdle(); 
//  System.out.println("idle: " +CpuPerc.format(idle) +", system: "+CpuPerc.format(system)+ ", user: "+CpuPerc.format(user)); 
     return new Double[] {system, user, idle}; 
    } 

    public static double getMetric(String pid) throws SigarException { 
     ProcCpu cpu = sigar.getProcCpu(pid); 
//  System.out.println(sigar.getProcFd(pid)); 
//  System.err.println(cpu.toString()); 
     return cpu.getPercent(); 
    } 

} 

RAM的數據:

public class RamData { 

    private static Sigar sigar; 
    private static Map<String, Long> pageFoults; 

    public RamData(Sigar s) throws SigarException { 
     sigar = s; 
     System.out.println(getMetric().toString()); 
    } 

    public static void main(String[] args) throws SigarException, 
      InterruptedException { 
     new RamData(new Sigar()); 
     RamData.startMetricTest(); 
    } 

    public static void startMetricTest() throws SigarException, 
      InterruptedException { 
     while (true) { 
      Map<String, String> map = RamData.getMetric("" + sigar.getPid()); 
      System.out.println("Resident: \t\t" 
        + Sigar.formatSize(Long.valueOf(map.get("Resident")))); 
      System.out.println("PageFaults: \t\t" + map.get("PageFaults")); 
      System.out.println("PageFaultsTotal:\t" + map.get("PageFaultsTotal")); 
      System.out.println("Size: \t\t" 
        + Sigar.formatSize(Long.valueOf(map.get("Size")))); 
      Map<String, String> map2 = getMetric(); 
      for (Entry<String, String> e : map2.entrySet()) { 
       String s; 
       try { 
        s = Sigar.formatSize(Long.valueOf(e.getValue())); 
       } catch (NumberFormatException ex) { 
        s = ((int) (double) Double.valueOf(e.getValue())) + "%"; 
       } 
       System.out.print(" " + e.getKey() + ": " + s); 
      } 
      System.out.println("\n------------------"); 
      Thread.sleep(1000); 
     } 
    } 

    public static Map<String, String> getMetric() throws SigarException { 
     Mem mem = sigar.getMem(); 
     return (Map<String, String>) mem.toMap(); 
    } 

    public static Map<String, String> getMetric(String pid) 
      throws SigarException { 
     if (pageFoults == null) 
      pageFoults = new HashMap<String, Long>(); 
     ProcMem state = sigar.getProcMem(pid); 
     Map<String, String> map = new TreeMap<String, String>(state.toMap()); 
     if (!pageFoults.containsKey(pid)) 
      pageFoults.put(pid, state.getPageFaults()); 
     map.put("PageFaults", "" 
       + (state.getPageFaults() - pageFoults.get(pid))); 
     map.put("PageFaultsTotal", ""+state.getPageFaults()); 
     return map; 
    } 
} 

PROCES-數據:

public class ProcessData { 

    private static Sigar sigar; 

    public ProcessData(Sigar s) throws SigarException { 
     this.sigar = s; 
     System.out.println(getMetric().toString()); 
     System.out.println(getMetric(getPidString()).toString()); 
    } 

    public static void main(String[] args) throws SigarException { 
     new ProcessData(new Sigar()); 
     System.out.println(ProcessData.getMetric()); 
     System.out.println(ProcessData.getMetric(getPidString())); 
    } 

    public static Map<String, String> getMetric() throws SigarException { 
     ProcStat state = sigar.getProcStat(); 
     return (Map<String, String>) state.toMap(); 
    } 

    public static Map<String, String> getMetric(String pid) throws SigarException { 
     ProcState state = sigar.getProcState(pid); 
     return (Map<String, String>) state.toMap(); 
    } 

    public static long getPid() { 
     return sigar.getPid(); 
    } 

    public static String getPidString() { 
     return ""+sigar.getPid(); 
    } 

} 
+0

嗨,我想獲得RamDATA使用你的代碼。請解釋居民與內存大小之間的區別 –

1

自那時以來沒有太大的變化,除非它是由另一組完成。下面的幾個例子是Java 7 SE中包含的一些重要更改。可悲的是,他們中沒有一個是你正在尋找的。

http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html

javamelody我之前用的是非常簡單的,我能得到它的時候 https://code.google.com/p/javamelody/
http://demo.javamelody.cloudbees.net/monitoring

低於

短期內大量運行的是另一種選擇 https://github.com/oshi/oshi

+0

感謝:)不過我用,需要java7變化的鏈接! – headgrowe

+0

這些是從Java 6到Java 7的變化。我不知道我明白你在找什麼。 –

+0

是的,該帖子是從2011年,只是問是否有新的東西......這意味着在這篇文章中的最佳解決方案是「SIGAR API」 – headgrowe

0

你爲什麼不能只使用像波紋管,

try { 
     for (String ni : sigar.getNetInterfaceList()) {   
     NetInterfaceStat netStat = sigar.getNetInterfaceStat(ni); 
     total+=netStat.getRxBytes();   
     } 
    } catch (SigarException e) { 
     e.printStackTrace(); 
    } 

是什麼差異 ???

+0

其很久以前,但我認爲這是因爲內部溝通......我只是想知道什麼是進出機器......這意味着只有通過真實硬件接口......試試看,你會明白我的意思......然而,我對你的改進感興趣 – headgrowe

+1

我運行了你編寫的代碼,並將結果與​​DUMeter進行比較。但結果是不同的。 – Ravindu

+0

然後請發佈一個更好的代碼:)簡單的代碼沒有對我的解決方案... propably的sigar代碼改變 – headgrowe

相關問題