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

我发现这篇较旧的文章如何监视计算机 -cpu -memory-and-disk-usage-in-java并且想要问一下,如果java 7中有新内容,我想得到当前的CPU- ,RAM-和netzwork-定期使用我的应用程序。 它必须适用于linux(mac)和windows。 数据不能非常详细,3个值就足够了(cpu:10%,Ram 4%,Network 40%)。 如果数据仅适用于应用程序而不是整个操作系统,那将会很酷,但这也可行。

感谢帮助

回答我自己的问题; P我写的一些代码……

NetworkData:

public class NetworkData { static Map rxCurrentMap = new HashMap(); static Map> rxChangeMap = new HashMap>(); static Map txCurrentMap = new HashMap(); static Map> txChangeMap = new HashMap>(); 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 l : rxChangeMap.values()) l.clear(); for (List l : txChangeMap.values()) l.clear(); return new Long[] { totalrxDown, totaltxUp }; } private static long getMetricData(Map> rxChangeMap) { long total = 0; for (Entry> 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 currentMap, Map> changeMap, String hwaddr, long current, String ni) { Long oldCurrent = currentMap.get(ni); if (oldCurrent != null) { List list = changeMap.get(hwaddr); if (list == null) { list = new LinkedList(); 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 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 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 map2 = getMetric(); for (Entry 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 getMetric() throws SigarException { Mem mem = sigar.getMem(); return (Map) mem.toMap(); } public static Map getMetric(String pid) throws SigarException { if (pageFoults == null) pageFoults = new HashMap(); ProcMem state = sigar.getProcMem(pid); Map map = new TreeMap(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 getMetric() throws SigarException { ProcStat state = sigar.getProcStat(); return (Map) state.toMap(); } public static Map getMetric(String pid) throws SigarException { ProcState state = sigar.getProcState(pid); return (Map) state.toMap(); } public static long getPid() { return sigar.getPid(); } public static String getPidString() { return ""+sigar.getPid(); } } 

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

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

有什么区别 ???

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

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

自那以后没有太大变化,除非是由另一个团体完成的。 以下是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