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

2024-03-31

我找到了这篇旧文章如何在 Java 中监控计算机的 cpu 内存和磁盘使用情况 https://stackoverflow.com/questions/47177/how-to-monitor-the-computers-cpu-memory-and-disk-usage-in-java并想问一下,java 7 中是否有新功能。我想定期获取我的应用程序的当前 CPU、RAM 和网络使用情况。它必须适用于 Linux (Mac) 和 Windows。数据不必非常详细,3 个值就足够了(cpu:10%,Ram 4%,网络 40%)。如果数据仅适用于应用程序而不是整个操作系统,那就太酷了,但这也可以。

感谢帮助


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

}

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

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取 Java7 应用程序的 CPU、RAM 和网络使用情况 的相关文章

  • Spring JUnit 测试未加载完整的应用程序上下文

    您好 我正在尝试使用 spring junit 测试用例 并且我需要加载完整的应用程序上下文 然而 junit 测试不会初始化完整的应用程序上下文 测试类 RunWith SpringJUnit4ClassRunner class Spri
  • 了解 hibernate @Type 注解

    来自休眠官方文档 http docs jboss org ejb3 app server HibernateAnnotations reference en html single d0e2018 org hibernate annotat
  • Linkify 是否适用于 Android 中的 TextView?

    我有这段代码适用于调用 EditText 的方法 我尝试对 TextView 使用相同的代码 但它不起作用 文本不会像 EditText 那样变成超链接 有人知道为什么吗 public class MainActivity extends
  • Spring Autowire 在同一类中创建 Bean 会导致:请求的 bean 当前正在创建错误*

    我知道该错误是不言自明的 但是当我将其余模板的设置从构造函数删除为 Autowired Qualifier myRestTemplate private RestTemplate restTemplate 时 它 起作用了 只是想知道如果同
  • 如何在java中创建保留方法参数注释的动态代理?

    我目前正在尝试代理一些现有的 JAX RS 资源 以便允许我使用 Hibernate Validator 的方法验证支持 但是 当我代理我的类 当前使用 cglib 2 2 时 代理类中的参数上不存在 FormParam 注释 因此 JAX
  • Java中如何让另一个线程休眠

    我有一个扩展 Thread 的类 这个线程在运行时大部分时间都在睡眠 它会执行一个检查 如果 true 执行一个简单的操作 然后睡眠 1 2 秒并重复 该类还有一个由其他线程调用的公共方法 如果调用此函数 我希望线程在已经休眠的情况下休眠更
  • Java 递增/递减运算符 - 它们的行为方式是什么,功能是什么?

    开始学习Java已经三天了 我有这个程序 但我不明白其中的代码main方法与 and 运营商 我什至不知道该怎么称呼他们 这些操作员的名字 谁能给我解释一下这是怎么回事 class Example public static void ma
  • Python套接字模块:Recv()数据响应被切断

    解释 我目前正在尝试使用 python 脚本控制智能电源板 为了实现这一点 我使用了带有套接字模块的 TCP 连接 大约 75 的情况下 我会得到我正在寻找的响应 数据 并且一切都运行良好 然而 大约 25 的情况下 响应会以完全相同的长度
  • 使用反射检查java中的字段是否为final

    我正在编写一个类 它在某些时候必须拥有它的所有内容Fields 从该类的另一个项目分配 我通过反思做到了 for Field f pg getClass getDeclaredFields f set this f get pg 问题是 这
  • 如何在Java中读取文件的最后“n”个字节

    如何在不使用 RandomAccessFile 的情况下从文件中读取最后 n 个字节 我的文件中的最后 6 个字节包含写回文件时的重要信息 我需要写入原始文件 然后将最后 6 个字节附加到其他地方 有什么指导吗 谢谢 你必须使用随机存取文件
  • 如何从 ScheduledExecutorService 中删除任务?

    我有一个ScheduledExecutorService定期执行一些不同的任务scheduleAtFixedRate Runnable INIT DELAY ACTION DELAY TimeUnit SECONDS 我也有不一样的Runn
  • 并发 log4j

    我有自己的日志引擎 它将日志写入带有阻塞队列的单独线程上 为了使用 标准软件 我正在考虑切换到 log4j 我不希望我的高并发软件因日志命令而变慢 这些日志命令在调用命令时将所有内容写入磁盘 log4j 可以用作垃圾箱吗 Log4j 是大多
  • 如何在RecyclerView中实现setOnScrollListener

    当用户到达列表中可见的项目时 如何在底部显示进度栏 我已经编写了一个代码 其中我使用网络服务获取数据 现在我想填充部分记录 因为我有大约630 条记录在我的 JSON 中 这是我用来从 JSON 获取数据并填充到 RecyclerView
  • csharp类可以像java类一样“继承”xml文档吗?

    我正在向一些csharp代码添加注释 并且我正在使用 net 或其他东西 提供的xml语言 我有一个接口和一些实现类 我在界面中有一个方法 它有一个注释 在实现类中没有对实现方法进行注释 当人们在java中这样做时 javadoc在生成文档
  • 在Android应用程序中导入Java项目?

    即使 Java 项目中的某些类在普通 Android 项目中无法识别 我是否可以在 Android 项目中使用 Java 项目 例如javax xml包 我认为有两种可能性 使用该 java 项目创建一个 jar 并将其导入到 androi
  • Java泛型方法不能调用另一个约束更宽松的泛型方法并返回其值

    我想这样做
  • 有没有办法在 Eclipse 中自动附加非 JRE 包的 Javadoc?

    首先 这与 Java SE Javadocs 无关 效果很好 我们有一个基于 Java 的大型平台 包含大约 20 个 API 包 对于使用我们平台的用户 我们希望工具提示和其他此类内置文档支持能够像 Java API 那样工作 我们的 J
  • 如何重定向到另一个 URI 并访问先前 modelAndView 中的对象

    我有以下代码 我想访问 nextPage jsp 上的 booleanValueObj 这是怎么做到的 该对象并不总是可用于每个请求的 nextPage 方法 因此 requestParam 似乎不合适 RequestMapping met
  • 理解 htonl() 和 ntohl()

    我正在尝试使用 unix 套接字来测试向本地主机发送一些 udp 数据包 据我了解 当设置 ip 地址和端口以发送数据包时 我会填写我的sockaddr in将值转换为网络字节顺序 我在 OSX 上 我很惊讶这个 printf ntohl
  • 带有 CompletableFuture 的 MDC 记录器

    我正在使用 MDC Logger 除了一种情况外 它对我来说非常适合 无论我们在代码中的何处使用 CompletableFuture 对于创建的线程 MDC 数据都不会传递到下一个线程 因此日志会失败 例如 在代码中我使用下面的代码片段来创

随机推荐