2012-06-12 5 views
5

Я нашел эту старую статью how-to-monitor-the-computers-cpu-memory-and-disk-usage-in-java и просил спросить, есть ли что-то новое в java 7. Я хочу получить текущие CPU-, RAM- и netzwork - Использование моего приложения периодически. Он должен работать для linux (mac) и окон. Данные не должны быть чрезвычайно подробными, 3 значения будут достаточными (cpu: 10%, Ram 4%, Network 40%). Было бы здорово, если бы данные были только для приложения, а не для всей ОС-системы, однако это тоже сработало бы.Как получить CPU, ОЗУ и использование сети Java7 App

Спасибо за помощь

ответ

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-Data:

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-Data:

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

после этого pls выведет лучший код :) простой код wosn't решение для меня ... propably сигар код измененный – headgrowe

Смежные вопросы