Linux下,java获取CPU使用率、内存使用率

来源:互联网 发布:大数据应用的意义 编辑:程序博客网 时间:2024/05/01 22:41
/**
 * 
 */
package com.test.cpumem;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Logger;




/**
 * Linux下,java获取CPU使用率、内存使用率
 * @author liuhailun
 *
 */
public class CpuUsage {


private static Logger logger = Logger.getLogger(CpuUsage.class.toString().replace("class ", ""));
private static CpuUsage instance = new CpuUsage();
private CpuUsage(){

}

public static CpuUsage getCpuUsage(){
return instance;
}

private class TimeBean {
private long idleCpuTime = 0;
private long totalCpuTime = 0;

public long getTotalCpuTime() {
return totalCpuTime;
}

public void setTotalCpuTime(long totalCpuTime) {
this.totalCpuTime = totalCpuTime;
}

public long getIdleCpuTime() {
return idleCpuTime;
}

public void setIdleCpuTime(long idleCpuTime) {
this.idleCpuTime = idleCpuTime;
}
}
/**
* 采集CPU使用率 
* @return 
*/
public float get() {

//CPU利用率 = 1- (idle2-idle1)/(cpu2-cpu1)
logger.info("开始收集cpu使用率...");
float cpuUsage = 0;
Runtime runtime = Runtime.getRuntime();
try {
String command = "cat /proc/stat";
//第一次采集CPU时间
//long startTime = System.currentTimeMillis();
TimeBean timeBean1 = getCpuTimeData(runtime, command);
long idleCpuTime1 = 0,totalCpuTime1 = 0;
idleCpuTime1 = timeBean1.getIdleCpuTime();
totalCpuTime1 = timeBean1.getTotalCpuTime();
try {
Thread.sleep(100);
} catch (Exception e) {
logger.info(e.getMessage());
}
//long endTime = System.currentTimeMillis();
TimeBean timeBean2 = getCpuTimeData(runtime, command);
long idleCpuTime2 = 0,totalCpuTime2 = 0;
idleCpuTime2 = timeBean2.getIdleCpuTime();
totalCpuTime2 = timeBean2.getTotalCpuTime();
if(idleCpuTime1 != 0 && totalCpuTime1 != 0 && idleCpuTime2 != 0 && totalCpuTime2 != 0){
cpuUsage = 1 - (float)(idleCpuTime2 - idleCpuTime1) / (float)(totalCpuTime2 - totalCpuTime1);
}
} catch (Exception e) {
logger.info(e.getMessage());
}
return cpuUsage;
}


private TimeBean getCpuTimeData(Runtime runtime, String command) throws IOException {
TimeBean timeBean = new TimeBean();
Process pro1;
// Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例
pro1 = runtime.exec(command);
//分别为系统启动后空闲的CPU时间和总的CPU时间
long idleCpuTime1 = 0,totalCpuTime1 = 0;
BufferedReader bR = new BufferedReader(new InputStreamReader(pro1.getInputStream()));
String line = null;
while ((line = bR.readLine()) != null ) {
if(line.startsWith("cpu")){
line = line.trim();
logger.info(line);
String[] temp = line.split("\\s+");
idleCpuTime1 = Long.parseLong(temp[4]);
for (String s : temp) {
if(!s.startsWith("cpu")){
//CPU时间=user+system+nice+idle+iowait+irq+softirq
totalCpuTime1 += Long.parseLong(s);
}
}
logger.info("IdleCpuTime: " + idleCpuTime1 + ", " + "TotalCpuTime" + totalCpuTime1);
break;
}
}
timeBean.setIdleCpuTime(idleCpuTime1);
timeBean.setTotalCpuTime(totalCpuTime1);
bR.close();
pro1.destroy();
return timeBean;
}






/**
* @param args
*/
public static void main(String[] args) {
float cpuUse = 0;
CpuUsage cpuUsage = CpuUsage.getCpuUsage();
while (true) {
cpuUse = cpuUsage.get();
System.out.println(cpuUse);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}


}


}
0 0
原创粉丝点击