2012-06-12 4 views
5

Znalazłem ten starszy artykuł how-to-monitor-the-computers-cpu-memory-and-disk-usage-in-java i poprosiłem, jeśli jest coś nowego w Javie 7. Chcę uzyskać bieżący procesor, pamięć RAM i netWork-Okresowe korzystanie z mojej aplikacji. Musi działać dla linuksa (mac) i okien. Dane nie mogą być bardzo szczegółowe, wystarczyłoby 3 wartości (procesor: 10%, Ram 4%, Sieć 40%). Byłoby fajnie, gdyby dane dotyczyły samej aplikacji, a nie całego systemu os, jednak to też by działało.Jak zdobyć procesor, pamięć RAM i korzystanie z sieci aplikacji Java7

Dziękuję za pomoc

Odpowiedz

15

odpowiadając na moje własne pytanie; P jakiś kod napisałem ...

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

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; 
    } 
} 

Protokół danych:

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

Witam Próbuję uzyskać RamDATA za pomocą Twój kod. Wyjaśnij mi różnicę między rezydentem a rozmiarem pamięci –

1

Niewiele się zmieniło od tamtego czasu, chyba że zostało wykonane przez inną grupę. Poniżej znajdują się niektóre z istotnych zmian, które zostały uwzględnione w Java 7 SE. Niestety żadna z nich nie jest tym, czego szukasz.

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

javamelody Użyłem przed nim jest dość prosta i udało mi się dostać to działa w krótkim czasie https://code.google.com/p/javamelody/
http://demo.javamelody.cloudbees.net/monitoring

poniżej jest kolejna alternatywa https://github.com/oshi/oshi

+0

dzięki za link :) jednak używam i potrzebują zmiany java7! – headgrowe

+0

to są zmiany, które zostały wprowadzone z Java 6 do Java 7. Im nie jestem pewien, rozumiem, czego szukasz. –

+0

tak, post pochodzi z 2011 roku, właśnie pytałem, czy jest coś nowego ... to znaczy, że najlepszym rozwiązaniem w tym poście było "API SIGAR" – headgrowe

0

dlaczego nie można po prostu użyć jak poniżej,

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

jaka jest różnica ???

+0

dawno temu, ale myślę, że to było z powodu komunikacji wewnętrznej ... chciałem tylko wiedzieć, co się dzieje i wychodzi z maszyny ... to znaczy tylko komunikacja ponad rzeczywistą interfejsy sprzętowe ... po prostu wypróbuj to, zobaczysz co mam na myśli ...jednak jestem zainteresowany waszymi ulepszeniami – headgrowe

+1

Sprawdziłem kod, który napisałem i porównuję wynik z DUMETEREM. Ale wyniki są różne. – Ravindu

+0

następnie pls dodaj lepszy kod :) prosty kod nie jest rozwiązaniem dla mnie ... prawdopodobnie zmieniony kod sigar – headgrowe

Powiązane problemy