一个运行JavaWeb项目,我们需要知道这个系统运行的状况,这里我选择用sigar来获取本地系统信息。
Sigar是Hyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件。它用来从许多平台收集系统和处理信息. 这些平台包括:Linux, Windows, Solaris, AIX, HP-UX, FreeBSD and Mac。 OSX.Sigar有C,C#,Java和Perl API,java版的API为sigar.jar。sigar.jar的底层是用C语言编写的,它通过本地方法来调用操作系统API来获取系统相关数据。
1、通过Gradle依赖jar包
compile group: 'org.fusesource', name: 'sigar', version: '1.6.4'
2、添加相应的系统配置文件如win下的sigar-x86-winnt.dll,Linux下的libsigar-x86-linux.so及mac os下的libsigar-universal64-macosx.dylib等文件
在ManagerController添加初始化配置文件代码
//静态代码块
static {
try {
initSigar();
} catch (IOException e) {
e.printStackTrace();
}
}
//初始化sigar的配置文件
private static void initSigar() throws IOException {
SigarLoader loader = new SigarLoader(Sigar.class);
String lib = null;
try {
lib = loader.getLibraryName();
} catch (ArchNotSupportedException var7) {
logger.error(var7.getMessage(), var7);
}
ResourceLoader resourceLoader = new DefaultResourceLoader();
Resource resource = resourceLoader.getResource("classpath:/sigar/" + lib);
if (resource.exists()) {
InputStream is = resource.getInputStream();
File tempDir = FileUtil.createTempDirectory();
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(new File(tempDir, lib), false));
StreamUtil.copy(is, os);
is.close();
os.close();
System.setProperty("org.hyperic.sigar.path", tempDir.getCanonicalPath());
}
}
3、使用sigar获取系统使用情况
/**
* 管理台首页
*/
@RequestMapping("/index")
public String index(HttpServletRequest request, Model model) throws IOException {
String user = (String) request.getAttribute("user");
model.addAttribute("user", user);
Sigar sigar;
try {
//当前时间
model.addAttribute("nowTime", DateUtil.getDateTime());
//应用服务器
ServletContext servletContext = request.getSession().getServletContext();
model.addAttribute("servletServer", servletContext.getServerInfo());
//JDK版本
model.addAttribute("javaVersion", SystemUtil.getJavaVersion());
sigar = new Sigar();
CpuInfo[] cpuInfoList = sigar.getCpuInfoList();
//CPU信息
model.addAttribute("cpu", cpuInfoList[0].getVendor() + "(" + cpuInfoList[0].getModel() + ") " + cpuInfoList[0].getMhz() + "MHz x " + cpuInfoList.length + "核");
//操作系统
String osname = System.getProperties().getProperty("os.name");
model.addAttribute("osname", osname);
//服务器内存
Mem freeMemory = sigar.getMem();
model.addAttribute("mem", String.format("%.2fG", new Object[]{Double.valueOf((double) freeMemory.getTotal() / 1.073741824E9D)}));
//JVM内存
model.addAttribute("jvmMaxMem", String.format("%.2fM", new Object[]{Float.valueOf((float) Runtime.getRuntime().maxMemory() / 1048576.0F)}));
//
model.addAttribute("memUsedPercent", String.format("%.2f", new Object[]{Double.valueOf(freeMemory.getUsedPercent())}));
//CPU使用
model.addAttribute("cpuUsed", String.format("%.2f", new Object[]{Double.valueOf(CpuPerc.format(sigar.getCpuPerc().getCombined()).replace("%", ""))}));
long pid = sigar.getPid();
long startTime = sigar.getProcTime(pid).getStartTime();
//系统运行时间
model.addAttribute("runningTime", DateUtil.friendDuration(System.currentTimeMillis() - startTime));
//系统内存使用
long maxMemory2 = Runtime.getRuntime().maxMemory();
long freeMemory1 = Runtime.getRuntime().freeMemory();
//JVM内存使用
model.addAttribute("useableMemeory", String.format("%.2f", new Object[]{Double.valueOf((double) (maxMemory2 - freeMemory1) / ((double) maxMemory2 * 1.0D) * 100.0D)}));
} catch (SigarException e) {
logger.error("使用sigar获取服务器信息错误:", e);
}
return "manager/index";
}
//时间工具类计算总时间
public static String friendDuration(long ms) {
short ss = 1000;
int mi = ss * 60;
int hh = mi * 60;
int dd = hh * 24;
long day = ms / (long) dd;
long hour = (ms - day * (long) dd) / (long) hh;
long minute = (ms - day * (long) dd - hour * (long) hh) / (long) mi;
long second = (ms - day * (long) dd - hour * (long) hh - minute * (long) mi) / (long) ss;
long milliSecond = ms - day * (long) dd - hour * (long) hh - minute * (long) mi - second * (long) ss;
StringBuilder str = new StringBuilder();
if (day > 0L) {
str.append(day).append("天,");
}
if (hour > 0L) {
str.append(hour).append("小时,");
}
if (minute > 0L) {
str.append(minute).append("分钟,");
}
if (second > 0L) {
str.append(second).append("秒,");
}
if (milliSecond > 0L) {
str.append(milliSecond).append("毫秒,");
}
if (str.length() > 0) {
str = str.deleteCharAt(str.length() - 1);
}
return str.toString();
}
4、页面展示
<tr>
<td>管理员个数:</td>
<td>1 人</td>
<td>当前时间:</td>
<td id="nowTime">${nowTime}</td>
</tr>
<tr>
<td>CPU:</td>
<td>${cpu}</td>
<td>JDK版本:</td>
<td>${javaVersion}</td>
</tr>
<tr>
<td>操作系统:</td>
<td>${osname}</td>
<td>系统运行时间:</td>
<td>${runningTime}</td>
</tr>
<tr>
<td>服务器内存:</td>
<td>${mem}</td>
<td>JVM内存:</td>
<td>${jvmMaxMem}</td>
</tr>
<tr>
<td>系统内存使用:</td>
<td>${memUsedPercent}%</td>
<td>JVM内存使用:</td>
<td>${useableMemeory}%</td>
</tr>
<tr>
<td>系统CPU使用:</td>
<td>${cpuUsed}%</td>
<td>应用服务器:</td>
<td>${servletServer}</td>
</tr>
页面情况如下,系统具体使用情况就能看的一目了然。如需其他的数据,可以自行去查看API使用。
欢迎转载,转载请注明出处 http://www.dingyinwu.com/article/62.html
如果文章中有任何问题或者可以改进的地方,请大家多提提意见,我会非常感激。