前言
今天来了个需求,需要实时监控服务器cpu跟内存参数的占用百分比。
还没开始前首要想到的是用java执行linux命令:cat /proc/meminfo
这里面内存具体信息啥都有,查看cpu的话最常用的就是top+p。
想了一通下来,这样做出来好恶心啊...
sigar
搜了一下性能监控方面的资料,看到一个sigar,我之前没接触过sigar,看很多博文都把这个牛逼吹天上去了。
既然这么厉害,那就搞一下呗~
maven
<sigar.version>1.6.4</sigar.version>
<dependency>
<groupId>org.fusesource</groupId>
<artifactId>sigar</artifactId>
<version>${sigar.version}</version>
</dependency>
引入需要的文件
这里插一嘴,因为sigar最恶心的一点就是需要用它的话。
windows就要在jdk的bin里面加上它的dll文件,linux也同样需要.so文件。
sigar的jar包及win、linux的dll文件.zip
这里开始直接就在加载类的时候把需要的都动态加到环境变量了,提前把需要的东西都集成到项目里。
sigarPackages
代码层实现
import com.mdm.skr.mdm_common.utils.PropertiesUtil;
import com.skr.mdm.projectBegin.ProjectBegin;
import org.hyperic.sigar.*;
import java.io.File;
import java.nio.file.Paths;
import java.text.DecimalFormat;
/**
* 监控系统的工具类
* @author 954
*/
public class SysStatusUtil {
static {
try {
String classPath = SysStatusUtil.class.getClassLoader().getResource("").getPath().concat("sigarPackages");
String path = System.getProperty("java.library.path");
String osName = System.getProperty("os.name").toLowerCase();
path += osName.contains("windows") ? ";".concat(classPath) :
osName.contains("linux") ? ":".concat(classPath) : "" ;
System.setProperty("java.library.path", path);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 更新系统状态配置内容
*/
public static void updateSysStatus() throws SigarException {
SysStatusData statusData = new SysStatusData();
CpuPerc perc = statusData.getPerc();
// 获取cpu使用率
String sysCpuUsed = CpuPerc.format(perc.getSys());
// 获取内存使用率
Mem mem = statusData.getMem();
String sysMemoryUsed = new DecimalFormat("0.0%").format(
Double.valueOf(mem.getUsed()) / Double.valueOf(mem.getTotal()));
// 更改资源文件
PropertiesUtil.setProperty("sysStatus","cpuUsed",sysCpuUsed) ;
PropertiesUtil.setProperty("sysStatus","memoryUsed",sysMemoryUsed) ;
}
}
import lombok.Getter;
import org.hyperic.sigar.*;
@Getter
public class SysStatusData {
// cpu信息
private CpuInfo info;
private CpuPerc perc;
private Cpu timer;
private CpuPerc[] cpuPercList ;
// 内存信息
private Mem mem ;
public SysStatusData() throws SigarException {
Sigar sigar = new Sigar();
this.info = sigar.getCpuInfoList()[0];
this.perc = sigar.getCpuPerc();
this.cpuPercList = sigar.getCpuPercList();
this.timer = sigar.getCpu();
this.mem = sigar.getMem() ;
}
}
页面demo效果(经过测试,这个参数值还是挺准的)
sigar的强大可不仅仅是获取cpu跟内存这么鸡肋,强大到各种服务器性能网络状态以及硬盘等都给你扒出来,还是很好用的。
对你有帮助的话,右上角给个赞呗~