首页 文章

如何获取Java7应用程序的CPU,RAM和网络使用情况

提问于
浏览
8

我发现这篇较老的文章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%) . 如果数据仅适用于应用程序而不是整个操作系统,那将会很酷,但这也可行 .

感谢帮助

4 回答

  • 1

    回答我自己的问题; 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();
        }
    
    }
    
  • 15

    为什么你不能像波纹管一样使用,

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

    什么是 difference ???

  • 1

    我会使用Metrics java库:http://metrics.codahale.com/

    它附带Sigar集成:https://github.com/cb372/metrics-sigar

  • 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

相关问题