怎么说呢,本人菜鸟一枚,费了几天时间,终于做了一个用java获取JVM的CPU占用率、内存占用率、线程数及服务器的网口吞吐率、磁盘读写速率的实现。
其中windows环境下获取jvm 的cpu占用率这里是参考网上别人的东西(在此感谢提供参考的网友),其他的都是基于自己的想法做出来的。该工具类亲测
在win7 64位系统和CentOS6系统没有问题,其他的暂时没有测过,欢迎高手指教,勿喷勿喷,感谢手下留情~
运行环境:jdk 1.8 + tomcat 7 + Spring 4.3
tomcat 容器启动及进入init()进行JVM PID的获取及执行任务
可能会碰到的问题:无法引入com.sun.management.OperatingSystemMXBean
解决方案:Eclipse默认把这些受访问限制的API设成了ERROR。只要把Windows-Preferences-Java-Complicer-Errors/Warnings里面的
Deprecated and restricted API中的Forbidden references(access rules)
选为Warning就可以编译通过。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.Formatter;
import java.util.StringTokenizer;
import java.util.Timer;
import java.util.TimerTask;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.nufront.euht.model.SysPerformInfo;
import com.nufront.euht.service.api.sys.SysPerformInfoServiceI;
import com.nufront.euht.util.UuidUtil;
import com.sun.management.OperatingSystemMXBean;
/**
* 网管信息信息信息采集类
*
* @author liming.cen
* @date 2017-4-11
*/
@Service
public class SysInfoAcquirerService {
private static final int CPUTIME = 5000;
/**
* 网管进程信息采集周期(注意:PERIOD_TIME 一定要大于 SLEEP_TIME )
*/
private static final int PERIOD_TIME = 1000 * 60 * 15;
/**
* 此类中Thread.sleep()里的线程睡眠时间
*/
private static final int SLEEP_TIME = 1000 * 60 * 9;
private static final int PERCENT = 100;
private static final int FAULTLENGTH = 10;
private String isWindowsOrLinux = isWindowsOrLinux();
private String pid = "";
private Timer sysInfoGetTimer = new Timer("sysInfoGet");
@Autowired
private SysPerformInfoServiceI sysPerformInfoService;
public Logger log = Logger.getLogger(SysInfoAcquirerService.class);
/**
* 初始化bean的时候就立即获取JVM进程的PID及执行任务
*
* @return
*/
@PostConstruct
public void init() {
if (isWindowsOrLinux.equals("windows")) { // 判断操作系统类型是否为:windows
getJvmPIDOnWindows();
} else {
getJvmPIDOnLinux();
}
sysInfoGetTimer.schedule(new SysInfoAcquirerTimerTask(), 10 * 1000, PERIOD_TIME);
}
/**
* 判断是服务器的系统类型是Windows 还是 Linux
*
* @return
*/
public String isWindowsOrLinux() {
String osName = System.getProperty("os.name");
String sysName = "";
if (osName.toLowerCase().startsWith("windows")) {
sysName = "windows";
} else if (osName.toLowerCase().startsWith("linux")) {
sysName = "linux";
}
return sysName;
}
/**
* 获取JVM 的CPU占用率(%)
*
* @return
*/
public String getCPURate() {
String cpuRate = "";
if (isWindowsOrLinux.equals("windows")) { // 判断操作系统类型是否为:windows
cpuRate = getCPURateForWindows();
} else {
cpuRate = getCPURateForLinux();
}
return cpuRate;
}
/**
* windows环境下获取JVM的PID
*/
public void getJvmPIDOnWindows() {
RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
pid = runtime.getName().split("@")[0];
log.info("PID of JVM:" + pid);
}
/**
* linux环境下获取JVM的PID
*/
public void getJvmPIDOnLinux() {
String command = "pidof java";
BufferedReader in = null;
Process pro = null;
try {
pro = Runtime.getRuntime().exec(new String[] { "sh", "-c", command });
in = new BufferedReader(new InputStreamReader(pro.getInputStream()));
StringTokenizer ts = new StringTokenizer(in.readLine());
pid = ts.nextToken();
log.info("PID of JVM:" + pid);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取JVM的内存占用率(%)
*
* @return
*/
public String getMemoryRate() {
String memRate = "";
if (isWindowsOrLinux.equals("windows")) { // 判断操作系统类型是否为:windows
memRate = getMemoryRateForWindows();// 查询windows系统的cpu占用率
} else {
memRate = getMemoryRateForLinux();// 查询linux系统的cpu占用率
}
return memRate;
}
/**
* 获取JVM 线程数
*
* @return
*/
public int getThreadCount() {
int threadCount = 0;
if (isWindowsOrLinux.equals("windows")) { // 判断操作系统类型是否为:windows
threadCount = getThreadCountForWindows();// 查询windows系统的线程数
} else {
threadCount = getThreadCountForLinux();// 查询linux系统的线程数
}
return threadCount;
}
/**
* 获取磁盘读写速率(MB/s)
*
* @return
*/
// public String getDiskAccess() { // TODO:待完成
// String diskAccess = "";
// if (isWindowsOrLinux.equals("windows")) { // 判断操作系统类型是否为:w