2012-06-12 23 views
5

Tôi đã tìm thấy bài viết cũ hơn how-to-monitor-the-computers-cpu-memory-and-disk-usage-in-java và hỏi, nếu có điều gì đó mới trong java 7. Tôi muốn lấy CPU, RAM- và CPU hiện tại netzwork-Sử dụng ứng dụng của tôi theo định kỳ. Nó phải làm việc cho linux (mac) và windows. Dữ liệu không được cực kỳ chi tiết, 3 giá trị sẽ là đủ (cpu: 10%, Ram 4%, Network 40%). Sẽ được mát mẻ nếu dữ liệu chỉ dành cho ứng dụng chứ không phải toàn bộ hệ điều hành, tuy nhiên điều này cũng sẽ hoạt động.Cách lấy CPU, RAM và sử dụng mạng của ứng dụng Java7

Cảm ơn bạn đã giúp đỡ

Trả lời

15

trả lời câu hỏi của riêng tôi, P một số mã tôi đã viết ...

.210

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

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 dữ liệu:

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

Xin chào Tôi đang cố gắng lấy RamDATA bằng cách sử dụng ma cua ban. Vui lòng giải thích sự khác biệt giữa cư dân và kích thước của bộ nhớ –

1

Không có nhiều thay đổi kể từ đó trừ khi nhóm khác thực hiện. dưới đây là một số thay đổi quan trọng đã được bao gồm trong Java 7 SE. Đáng buồn thay không ai trong số họ là những gì bạn đang tìm kiếm.

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

javamelody tôi đã sử dụng trước đó nó là khá đơn giản và tôi đã có thể làm cho nó chạy trong một khoảng thời gian ngắn https://code.google.com/p/javamelody/
http://demo.javamelody.cloudbees.net/monitoring

dưới đây là một thay thế https://github.com/oshi/oshi

+0

nhờ các liên kết :) Tuy nhiên, tôi sử dụng và cần những thay đổi của java7! – headgrowe

+0

đó là những thay đổi đã được thực hiện từ Java 6 đến Java 7. Im không chắc chắn tôi hiểu những gì bạn đang tìm kiếm. –

+0

vâng, bài đăng là từ năm 2011, chỉ cần hỏi xem có gì mới ... có nghĩa là giải pháp tốt nhất trong bài đăng này là "SIGAR API" – headgrowe

0

lý do tại sao không thể bạn chỉ cần sử dụng như dưới đây,

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

chênh lệch khác biệt ???

+0

thời gian dài trước đây, nhưng tôi nghĩ đó là vì giao tiếp nội bộ ... tôi chỉ muốn biết cái gì đang đi vào và ra khỏi máy ... có nghĩa là chỉ giao tiếp trên thực phần cứng giao diện ... chỉ cần thử nó ra, bạn sẽ thấy những gì tôi có nghĩa là ...Tuy nhiên, tôi quan tâm đến những cải tiến của bạn – headgrowe

+1

tôi chạy mã bạn đã viết và so sánh kết quả với DUMeter. Nhưng kết quả thì khác. – Ravindu

+0

sau đó xin gửi một mã tốt hơn :) mã đơn giản wosn't giải pháp cho tôi ... propably mã sigar thay đổi – headgrowe

Các vấn đề liên quan