例如,在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#。