Java获取Linux下的内存、CPU、DISK

/**
	 * 获取 CPU.
	 * 
	 * @return
	 */
	public static double getCpuPercent() {
		OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
		String osJson = JSONObject.toJSONString(operatingSystemMXBean);
		JSONObject jsonObject = JSONObject.parseObject(osJson);

		double processCpuLoad = jsonObject.getDouble("processCpuLoad") * 100;
		double systemCpuLoad = jsonObject.getDouble("systemCpuLoad") * 100;

		Long totalPhysicalMemorySize = jsonObject.getLong("totalPhysicalMemorySize");
		Long freePhysicalMemorySize = jsonObject.getLong("freePhysicalMemorySize");
		double totalMemory = 1.0 * totalPhysicalMemorySize;
		double freeMemory = 1.0 * freePhysicalMemorySize;
		double memoryUseRatio = 1.0 * (totalPhysicalMemorySize - freePhysicalMemorySize) / totalPhysicalMemorySize
				* 100;

		return systemCpuLoad;
	}

	/**
	 * 获取 MEM.
	 *
	 * @return
	 */
	public static double getMemPercent() {
		OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
		String osJson = JSONObject.toJSONString(operatingSystemMXBean);
		JSONObject jsonObject = JSONObject.parseObject(osJson);

		Long totalPhysicalMemorySize = jsonObject.getLong("totalPhysicalMemorySize");
		Long freePhysicalMemorySize = jsonObject.getLong("freePhysicalMemorySize");

		// 获取缓存和缓冲区大小
		long buffers = 0L;
		long cached = 0L;
		try {
			Process process = Runtime.getRuntime().exec("free -m");
			BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
			String line;
			while ((line = reader.readLine()) != null) {
				if (line.startsWith("Mem:")) {
					String[] parts = line.split("\\s+");
					buffers = Long.parseLong(parts[5]) * 1024 * 1024; // 转换为字节
					cached = Long.parseLong(parts[6]) * 1024 * 1024; // 转换为字节
					break;
				}
			}
			reader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		double totalMemory = 1.0 * totalPhysicalMemorySize;
		double actualFreeMemory = 1.0 * (freePhysicalMemorySize + buffers + cached);
		double usedMemory = totalMemory - actualFreeMemory;
		double memoryUseRatio = (usedMemory / totalMemory) * 100;

		return memoryUseRatio;
	}

	/**
	 * 获取 DISK.
	 * 
	 * @return
	 */
	public static double getDiskPercent() {

		double diskPercent = 0;

		// TODO: 看哪个?给配置,或全返回 结构,由使用者判断.
		try {
			FileSystem fs = FileSystems.getDefault();

			for (FileStore store : fs.getFileStores()) {
				String name = store.name();
				long usableSpace = store.getUsableSpace();
				long totalSpace = store.getTotalSpace();
				long freeSpace = store.getUnallocatedSpace();

				double usageRate = (double) (totalSpace - freeSpace) / totalSpace * 100;

				diskPercent = diskPercent == 0 ? usageRate : diskPercent;

				LOGGER.info("name                     : [{}]", new Object[] { name });
				LOGGER.info("usableSpace              : [{}]", new Object[] { usableSpace });
				LOGGER.info("totalSpace               : [{}]", new Object[] { totalSpace });
				LOGGER.info("freeSpace                : [{}]", new Object[] { freeSpace });
				LOGGER.info("usageRate                : [{}]", new Object[] { String.format("%.2f", usageRate) });
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

		return diskPercent;
	}
### 使用Java获取Linux系统运行状态 为了在Java应用中获取Linux系统的运行状态,包括CPU内存以及磁盘I/O等信息,可以采用多种方式。一种常见的方式是借助于第三方库来简化这一过程。 #### 利用OSHI库获取系统信息 对于Spring Boot项目而言,在pom.xml文件中加入如下依赖以便引入OSHI库[^1]: ```xml <dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>6.4.0</version> </dependency> ``` 之后便可以在代码里轻松访问到所需的硬件数据了。下面是一些具体的例子。 #### 获取CPU信息 通过调用`SystemInfo`对象下的相应API接口可获得关于处理器的各种属性,比如总的逻辑核心数量等[^4]: ```java import oshi.SystemInfo; import oshi.hardware.CentralProcessor; public class CpuInfo { public static void main(String[] args) { SystemInfo si = new SystemInfo(); CentralProcessor processor = si.getHardware().getProcessor(); long[] prevTicks = processor.getSystemCpuLoadTicks(); // 打印CPU总数目 System.out.println("Total number of CPU cores:" + processor.getLogicalProcessorCount()); } } ``` #### 查询内存详情 同样地,也可以查询物理内存大小以及其他相关信息[^2]: ```java import oshi.hardware.GlobalMemory; public class MemoryInfo { public static void main(String[] args){ SystemInfo si = new SystemInfo(); GlobalMemory memory = si.getHardware().getMemory(); // 输出总RAM容量(单位:字节) System.out.printf("Total RAM:%d bytes\n",memory.getTotal()); } } ``` #### 查看磁盘读写情况 针对存储设备的操作性能指标,则可通过遍历所有已挂载卷的方式来收集必要的统计数据[^3]: ```java import java.util.List; import oshi.hardware.HWDiskStore; import oshi.hardware.HardwareAbstractionLayer; public class DiskIoStats { public static void main(String[] args){ HardwareAbstractionLayer hal = new SystemInfo().getHardware(); List<HWDiskStore> disks = hal.getDiskStores(); for (HWDiskStore disk : disks){ // 显示各分区名称及其对应的读/写字节数量 System.out.printf("%s read/write counts: %d/%d\n", disk.getName(),disk.getReadBytes(),disk.getWriteBytes()); } } } ``` 以上就是基于Java编程语言从不同方面监控Linux主机健康状况的方法概览。值得注意的是,这里所列举出来的只是部分功能演示;实际上OSHI还提供了更多高级特性等待开发者去发掘探索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值