Maven
在项目的pom.xml的dependencies中加入以下内容:
<!--Java基础工具类-->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.5.15</version>
</dependency>
<!--硬件信息获取-->
<dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>3.9.1</version>
</dependency>
</dependencies>
SystemHardwareInfo
package com.example.demo.model;import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.NumberUtil;
import lombok.Data;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.CentralProcessor.TickType;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.software.os.FileSystem;
import oshi.software.os.OSFileStore;
import oshi.software.os.OperatingSystem;
import oshi.util.Util;import java.util.LinkedList;
import java.util.List;
import java.util.Properties;/*** 服务器相关信息** @author fengshuonan* @Date 2019-07-13 13:42*/
@Data
public class SystemHardwareInfo {private static final int OSHI_WAIT_SECOND = 1000;/*** CPU相关信息*/private CpuInfo cpu = new CpuInfo();/*** 內存相关信息*/private MemInfo mem = new MemInfo();/*** JVM相关信息*/private JvmInfo jvm = new JvmInfo();/*** 服务器相关信息*/private SysInfo sys = new SysInfo();/*** 磁盘相关信息*/private List<SysFileInfo> sysFiles = new LinkedList<>();public void copyTo() {SystemInfo si = new SystemInfo();HardwareAbstractionLayer hal = si.getHardware();setCpuInfo(hal.getProcessor());setMemInfo(hal.getMemory());setSysInfo();setJvmInfo();setSysFiles(si.getOperatingSystem());}/*** 设置CPU信息*/private void setCpuInfo(CentralProcessor processor) {// CPU信息long[] prevTicks = processor.getSystemCpuLoadTicks();Util.sleep(OSHI_WAIT_SECOND);long[] ticks = processor.getSystemCpuLoadTicks();long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()];long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()];long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()];long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()];long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()];long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()];long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()];long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()];long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;cpu.setCpuNum(processor.getLogicalProcessorCount());cpu.setTotal(totalCpu);cpu.setSys(cSys);cpu.setUsed(user);cpu.setWait(iowait);cpu.setFree(idle);}/*** 设置内存信息*/private void setMemInfo(GlobalMemory memory) {mem.setTotal(memory.getTotal());mem.setUsed(memory.getTotal() - memory.getAvailable());mem.setFree(memory.getAvailable());}/*** 设置服务器信息*/private void setSysInfo() {Properties props = System.getProperties();sys.setComputerName(IpInfoUtils.getHostName());sys.setComputerIp(NetUtil.getLocalhostStr());sys.setOsName(props.getProperty("os.name"));sys.setOsArch(props.getProperty("os.arch"));sys.setUserDir(props.getProperty("user.dir"));}/*** 设置Java虚拟机*/private void setJvmInfo() {Properties props = System.getProperties();jvm.setTotal(Runtime.getRuntime().totalMemory());jvm.setMax(Runtime.getRuntime().maxMemory());jvm.setFree(Runtime.getRuntime().freeMemory());jvm.setVersion(props.getProperty("java.version"));jvm.setHome(props.getProperty("java.home"));}/*** 设置磁盘信息*/private void setSysFiles(OperatingSystem os) {FileSystem fileSystem = os.getFileSystem();OSFileStore[] fsArray = fileSystem.getFileStores();for (OSFileStore fs : fsArray) {long free = fs.getUsableSpace();long total = fs.getTotalSpace();long used = total - free;SysFileInfo sysFile = new SysFileInfo();sysFile.setDirName(fs.getMount());sysFile.setSysTypeName(fs.getType());sysFile.setTypeName(fs.getName());sysFile.setTotal(convertFileSize(total));sysFile.setFree(convertFileSize(free));sysFile.setUsed(convertFileSize(used));if (total == 0) {sysFile.setUsage(0);} else {sysFile.setUsage(NumberUtil.mul(NumberUtil.div(used, total, 4), 100));}sysFiles.add(sysFile);}}/*** 字节转换** @param size 字节大小* @return 转换后值*/public String convertFileSize(long size) {long kb = 1024;long mb = kb * 1024;long gb = mb * 1024;if (size >= gb) {return String.format("%.1f GB", (float) size / gb);} else if (size >= mb) {float f = (float) size / mb;return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);} else if (size >= kb) {float f = (float) size / kb;return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);} else {return String.format("%d B", size);}}
}
CpuInfo
package com.example.demo.model;import cn.hutool.core.util.NumberUtil;
import lombok.Setter;@Setter
public class CpuInfo {/*** 核心数*/private int cpuNum;/*** CPU总的使用率*/private double total;/*** CPU系统使用率*/private double sys;/*** CPU用户使用率*/private double used;/*** CPU当前等待率*/private double wait;/*** CPU当前空闲率*/private double free;public int getCpuNum() {return cpuNum;}public double getTotal() {return NumberUtil.round(NumberUtil.mul(total, 100), 2).doubleValue();}public double getSys() {return NumberUtil.round(NumberUtil.mul(sys / total, 100), 2).doubleValue();}public double getUsed() {return NumberUtil.round(NumberUtil.mul(used / total, 100), 2).doubleValue();}public double getWait() {return NumberUtil.round(NumberUtil.mul(wait / total, 100), 2).doubleValue();}public double getFree() {return NumberUtil.round(NumberUtil.mul(free / total, 100), 2).doubleValue();}}
MemInfo
package com.example.demo.model;import cn.hutool.core.util.NumberUtil;
import lombok.Setter;/*** 內存相关信息** @author fengshuonan* @Date 2019-07-13 13:42*/
@Setter
public class MemInfo {/*** 内存总量*/private double total;/*** 已用内存*/private double used;/*** 剩余内存*/private double free;public double getTotal() {return NumberUtil.div(total, (1024 * 1024 * 1024), 2);}public double getUsed() {return NumberUtil.div(used, (1024 * 1024 * 1024), 2);}public double getFree() {return NumberUtil.div(free, (1024 * 1024 * 1024), 2);}public double getUsage() {return NumberUtil.mul(NumberUtil.div(used, total, 4), 100);}
}
JvmInfo
package com.example.demo.model;import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import lombok.Setter;import java.lang.management.ManagementFactory;
import java.util.Date;/*** JVM相关信息** @author fengshuonan* @Date 2019-07-13 13:42*/
@Setter
public class JvmInfo {/*** 当前JVM占用的内存总数(M)*/private double total;/*** JVM最大可用内存总数(M)*/private double max;/*** JVM空闲内存(M)*/private double free;/*** JDK版本*/private String version;/*** JDK路径*/private String home;public double getTotal() {return NumberUtil.div(total, (1024 * 1024), 2);}public double getMax() {return NumberUtil.div(max, (1024 * 1024), 2);}public double getFree() {return NumberUtil.div(free, (1024 * 1024), 2);}public double getUsed() {return NumberUtil.div(total - free, (1024 * 1024), 2);}public String getVersion() {return version;}public String getHome() {return home;}public double getUsage() {return NumberUtil.mul(NumberUtil.div(total - free, total, 4), 100);}/*** 获取JDK名称*/public String getName() {return ManagementFactory.getRuntimeMXBean().getVmName();}/*** JDK启动时间*/public String getStartTime() {long time = ManagementFactory.getRuntimeMXBean().getStartTime();Date date = new Date(time);return DateUtil.formatDateTime(date);}/*** JDK运行时间*/public String getRunTime() {long time = ManagementFactory.getRuntimeMXBean().getStartTime();Date date = new Date(time);//运行多少分钟long runMS = DateUtil.between(date, new Date(), DateUnit.MS);long nd = 1000 * 24 * 60 * 60;long nh = 1000 * 60 * 60;long nm = 1000 * 60;long day = runMS / nd;long hour = runMS % nd / nh;long min = runMS % nd % nh / nm;return day + "天" + hour + "小时" + min + "分钟";}
}
SysInfo
package com.example.demo.model;import lombok.Data;/*** 系统相关信息** @author fengshuonan* @Date 2019-07-13 13:42*/
@Data
public class SysInfo {/*** 服务器名称*/private String computerName;/*** 服务器Ip*/private String computerIp;/*** 项目路径*/private String userDir;/*** 操作系统*/private String osName;/*** 系统架构*/private String osArch;}
SysFileInfo
package com.example.demo.model;import lombok.Data;/*** 系统文件相关信息** @author fengshuonan* @Date 2019-07-13 13:42*/
@Data
public class SysFileInfo {/*** 盘符路径*/private String dirName;/*** 盘符类型*/private String sysTypeName;/*** 文件类型*/private String typeName;/*** 总大小*/private String total;/*** 剩余大小*/private String free;/*** 已经使用量*/private String used;/*** 资源的使用率*/private double usage;}
IpInfoUtils
package com.example.demo.model;import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;/*** ip工具类** @author fengshuonan* @Date 2018/9/27 上午10:47*/
public class IpInfoUtils {/*** 获取客户端IP地址*/public static String getIpAddr(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();if (ip.equals("127.0.0.1")) {//根据网卡取本机配置的IPInetAddress inet = null;try {inet = InetAddress.getLocalHost();} catch (UnknownHostException e) {e.printStackTrace();}ip = inet.getHostAddress();}}// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割if (ip != null && ip.length() > 15) {if (ip.indexOf(",") > 0) {ip = ip.substring(0, ip.indexOf(","));}}if ("0:0:0:0:0:0:0:1".equals(ip)) {ip = "127.0.0.1";}return ip;}/*** 获取客户端主机名称*/public static String getHostName() {try {return InetAddress.getLocalHost().getHostName();} catch (UnknownHostException e) {}return "未知";}
}