我发现这篇较旧的文章“ 如何在Java中监视计算机的 Cpu内存和磁盘使用情况”,并想问一下Java 7中是否有新内容。我想获取当前的CPU- ,我的应用程序的RAM,netzwork和netzwork的使用情况。它必须适用于linux(mac)和Windows。数据不能太详细,三个值就足够了(cpu:10%,Ram 4%,Network 40%)。如果数据仅用于应用程序而不是整个操作系统,那将很酷,但是这也可以工作。
感谢帮助
回答我自己的问题;我写了一些代码…
网络数据:
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; } }
过程数据:
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(); } }