如何获取Java7应用程序的CPU、RAM和网络使用率

如何获取Java7应用程序的CPU、RAM和网络使用率,java,networking,cpu,java-7,ram,Java,Networking,Cpu,Java 7,Ram,我找到了这篇旧文章 我想问一下,Java7中是否有新的东西。我想定期获取我的应用程序当前的CPU、RAM和netzwork使用情况。它必须适用于linux(mac)和windows。数据不能非常详细,3个值就足够了(cpu:10%,Ram 4%,网络40%)。如果数据只针对应用程序,而不是整个操作系统,那就太酷了,不过这也行得通 谢谢你的帮助从那以后没有什么变化,除非它是由另一个小组完成的。 下面是Java7SE中包含的一些重要更改。不幸的是,它们都不是你想要的 我以前使用过的javamelo

我找到了这篇旧文章 我想问一下,Java7中是否有新的东西。我想定期获取我的应用程序当前的CPU、RAM和netzwork使用情况。它必须适用于linux(mac)和windows。数据不能非常详细,3个值就足够了(cpu:10%,Ram 4%,网络40%)。如果数据只针对应用程序,而不是整个操作系统,那就太酷了,不过这也行得通


谢谢你的帮助

从那以后没有什么变化,除非它是由另一个小组完成的。 下面是Java7SE中包含的一些重要更改。不幸的是,它们都不是你想要的

我以前使用过的javamelody非常简单,我能够在短时间内运行它

下面是另一种选择

OSHI不会为您提供每个进程的网络使用率或延迟
选中此项:

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

网络数据:

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

}
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;
    }
}
公共类RamData{
专用静态Sigar-Sigar;
私有静态地图;
公共RamData(sigars)抛出SigarException{
sigar=s;
System.out.println(getMetric().toString());
}
公共静态void main(字符串[]args)抛出SigarException,
中断异常{
新的RamData(新的Sigar());
RamData.startMetricTest();
}
public static void startMetricTest()抛出SigarException,
中断异常{
while(true){
Map Map=RamData.getMetric(“+sigar.getPid());
System.out.println(“常驻:\t\t”
+Sigar.formatSize(Long.valueOf(map.get(“常驻”));
System.out.println(“PageFaults:\t\t”+map.get(“PageFaults”);
System.out.println(“PageFaultsTotal:\t”+map.get(“PageFaultsTotal”);
System.out.println(“大小:\t\t”
+Sigar.formatSize(Long.valueOf(map.get(“Size”));
Map map2=getMetric();
对于(条目e:map2.entrySet()){
字符串s;
试一试{
s=Sigar.formatSize(Long.valueOf(e.getValue());
}捕获(NumberFormatException ex){
s=((int)(double)double.valueOf(e.getValue())+“%”;
}
系统输出打印(“+e.getKey()+”:“+s”);
}
System.out.println(“\n-------------------------------”);
睡眠(1000);
}
}
公共静态映射getMetric()抛出SigarException{
Mem Mem=sigar.getMem();
return(Map)mem.toMap();
}
公共静态映射getMetric(字符串pid)
抛出信号异常{
如果(pageFoults==null)
pageFoults=新HashMap();
ProcMem state=sigar.getProcMem(pid);
Map Map=newtreemap(state.toMap());
如果(!pageFoults.containsKey(pid))
pageFoults.put(pid,state.getPageFaults());
map.put(“页面错误”
+(state.getPageFaults()-pageFoults.get(pid));
put(“PageFaultsTotal”,“”+state.getPageFaults());
返回图;
}
}
过程数据:

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

}
公共类ProcessData{
专用静态Sigar-Sigar;
公共进程数据(Sigar s)抛出SIGAREException{
this.sigar=s;
System.out.println(getMetric().toString());
System.out.println(getMetric(getPidString()).toString());
}
公共静态void main(字符串[]args)抛出SigarException{
新的ProcessData(新的Sigar());
System.out.println(ProcessData.getMetric());
System.out.println(ProcessData.getMetric(getPidString());
}
公共静态映射getMetric()抛出SigarException{
ProcStat state=sigar.getProcStat();
返回(映射)state.toMap();
}
公共静态映射getMetric(字符串pid)抛出SIGAREException{
ProcState=sigar.getProcState(pid);
返回(映射)state.toMap();
}
公共静态长getPid(){
返回sigar.getPid();
}
公共静态字符串getPidString(){
返回“+sigar.getPid();
}
}

你为什么不能像下面那样使用

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

区别是什么?

我会使用Metrics java库:


它与Sigar集成一起提供:

感谢链接:)但是,我使用并需要更改java7!这些是从Java6到Java7所做的更改。我不知道我是否明白你在寻找什么。是的,这篇文章是2011年的,只是问是否有新的东西。。。这意味着本文中最好的解决方案是“sigarapi”thx@Bob Sinclar,我正在使用SIGAR!这真的很好,很容易编码。。。我是这个论坛的新手。也许我的问题也很难回答。Sigar在64位机器上工作似乎有问题:这是很久以前的事了,但我认为这是因为内部通信。。。我只是想知道机器进出的是什么。。。这意味着只有通过真正的硬件接口进行通信。。。试试看,你会明白我的意思。。。不过,我对你的改进很感兴趣。我运行了你编写的代码,并将结果与DUMeter进行了比较。但是结果是不同的。然后请发布一个更好的代码:)简单的代码不是我的解决方案。。。很可能sigar代码发生了变化。我正在尝试使用您的代码获取RamDATA。请解释内存驻留和大小之间的差异
  try {
      for (String ni : sigar.getNetInterfaceList()) {         
        NetInterfaceStat netStat = sigar.getNetInterfaceStat(ni);   
        total+=netStat.getRxBytes();        
      }
    } catch (SigarException e) {
      e.printStackTrace();
    }