我怎样才能得到应用程序自己的pid.如何在没有外部库的情况下获得Java应用程序的cpu使用情况



例如,在linux htop: http://scr.hu/1det/r1ghl中,当我通过pid: 27914检查我的应用程序cpu使用率时,它应该打印我51%。这该怎么办?

   public static int calcCPU(long cpuStartTime, long elapsedStartTime, int cpuCount) {
    long end = System.nanoTime();
    long totalAvailCPUTime = cpuCount * (end - elapsedStartTime);
    long totalUsedCPUTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime() - cpuStartTime;
    //log("Total CPU Time:" + totalUsedCPUTime + " ns.");
    //log("Total Avail CPU Time:" + totalAvailCPUTime + " ns.");
    float per = ((float) totalUsedCPUTime * 100) / (float) totalAvailCPUTime;
    log(per);
    return (int) per;
}
static boolean isPrime(int n) {
    // 2 is the smallest prime
    if (n <= 2) {
        return n == 2;
    }
    // even numbers other than 2 are not prime
    if (n % 2 == 0) {
        return false;
    }
    // check odd divisors from 3
    // to the square root of n
    for (int i = 3, end = (int) Math.sqrt(n); i <= end; i += 2) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}
public static void main(String[] args) throws ParseException, NoSuchAlgorithmException {
    int mb = 1024 * 1024;
    int gb = 1024 * 1024 * 1024;
    /* PHYSICAL MEMORY USAGE */
    System.out.println("n**** Sizes in Mega Bytes ****n");
    com.sun.management.OperatingSystemMXBean operatingSystemMXBean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    //RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
    //operatingSystemMXBean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean) java.lang.management.ManagementFactory.getOperatingSystemMXBean();
    for (int i = 0; i < 30; i++) {
        long start = System.nanoTime();
        // log(start);
        //number of available processors;
        int cpuCount = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();
        Random random = new Random(start);
        int seed = Math.abs(random.nextInt());
        log("n n CPU USAGE DETAILS nn");
        log("Starting Test with " + cpuCount + " CPUs and random number:" + seed);
        int primes = 10000;
        //
        long startCPUTime = ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
        start = System.nanoTime();
        while (primes != 0) {
            if (isPrime(seed)) {
                primes--;
            }
            seed++;
        }
        float cpuPercent = calcCPU(startCPUTime, start, cpuCount);
        log("CPU USAGE : " + cpuPercent + " % ");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
    }
    try {
        Thread.sleep(500);
    } catch (Exception ignored) {
    }
}

我试过这个,但我认为我不能检查这个方法使用cpu一个应用程序

我认为,如果不调用本地方法和/或第三方库和/或调用特定于平台的命令行命令,您目前无法在Java工具箱之外做到这一点。

Java Process对象目前是非常有限的。

好消息是Java 9中有一个新的Process功能:

总结

改进用于控制和管理操作系统的API流程。

动机

当前API的限制常常迫使开发人员求助于本机代码。

描述

Java SE对本机操作系统提供有限的支持流程。它提供了一个基本的API来设置环境和启动一个过程。从Java SE 7开始,流程流可以被重定向到文件、管道或可以继承。一旦启动,API就可以使用了销毁进程和/或等待进程终止。

许多企业应用程序和容器涉及多个Java而虚拟机和进程又有长期存在的需求包括:

获取当前Java虚拟的pid(或等价)的能力

使用现有API创建的进程的pid。

枚举系统上进程的能力。每个项目的信息进程可以包括它的pid、名称、状态,也许还有资源使用情况。

处理过程树的能力,特别是一些方法销毁进程树

处理数百个子过程的能力多路输出或错误流以避免创建线程/子流程。


编辑:建议使用,如果你想使用第三方库。

你可能想看看Sigar:

Sigar API提供了一个可移植的收集接口系统信息,如:

系统内存,交换,cpu,平均负载,正常运行时间,每进程登录内存,cpu,凭证信息,状态,参数,环境,打开文件文件系统检测和度量网络接口检测TCP和UDP连接表网络此信息在大多数操作系统中可用。但每个操作系统都有自己的方式来提供它。SIGAR提供开发人员可以使用一个API来访问这些信息,而不需要考虑底层平台。核心API是用纯C实现的当前为Java、Perl、Ruby、Python、Erlang、PHP和c#。

最新更新