用java获取linux服务器下的内存,cpu使用率,和硬盘信息

这篇博客介绍了如何使用Java通过执行脚本获取Linux系统的磁盘、内存和CPU使用状况。首先,通过`Runtime.exec()`执行`df -k`命令获取磁盘信息,并解析出/data分区的大小和使用率。接着,利用Java内置方法获取内存使用情况,转换为GB单位并计算使用率。最后,执行`top -b -n1`命令获取CPU占用百分比。这种方法弥补了传统Java API获取系统信息的不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:java执行脚本,拿到返回值,读取返回值,再对返回值进行分析获取想要的值。

传统的jdk查询系统信息不适用,要么是误差大,要么是难以实现。

//代码运行到linux上

//获取 disk使用情况 单位Byte
    public static Map<String, Object> getDiskStatus() {
        Map<String, Object> diskMap = new LinkedHashMap<>();
        long total = 0;
        try {
        //java执行脚本
            Runtime rt = Runtime.getRuntime();
            Process p = rt.exec("df -k");
            BufferedReader in = null;
            try {
                in = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String str = null;
                String[] strArray = null;
                int line = 0;
                // 一行行读
                while ((str = in.readLine()) != null) {
                    line++;
                    // 跳过第一行
                    if (line == 1) {
                        continue;
                    }
                    int m = 0;
                    // 一行以空格分开
                    strArray = str.split(" ");
                    // 行的遍历
                    for (String para : strArray) {
                        // 去掉空格的长度==0表示该位置为空
                        if (para.trim().length() == 0) {
                            continue;
                        }

                        ++m;
                        // 第2列
                        if (m == 2) {
                            Long dataCap = Long.valueOf(para) * 1024;
                            total += dataCap;
                            String mounted = strArray[strArray.length - 1];
                            if ("/data".equals(mounted)) {
                                // 数据分区大小
                                diskMap.put("disk_data", dataCap);
                            }
                        }

                        if (m == 5) {
                            // 如果该字符串以%
                            if (para.endsWith("%")) {
                                String mounted = strArray[strArray.length - 1];
                                if ("/data".equals(mounted)) {
                                    // 去掉%
                                    String s = para.replace("%", "");
                                    Float percent = Float.valueOf(s);
                                    // 数据分区已使用率
                                    diskMap.put("percent", percent);
                                }
                            }
                        }
                    }
                }
                diskMap.put("total", Long.valueOf(objectFormat(total)));
            } catch (Exception e) {
                LOG.error(e.getMessage());
            } finally {
                in.close();
            }
        } catch (Exception e) {
            LOG.error(e.getMessage());
        }
        return diskMap;
    }

//查询内存占比
public static Map<String, Float> getMemeryStatus() {
        Map<String, Float> map = new HashMap(10);
        // 从bit转成gb
        float constm = 1024 * 1024 * 1024;
        // 已使用的内存大小
        float usedPhysicalMemorySize = Float.parseFloat(objectFormat(getUsedPhysicalMemorySize() / constm));
        // 总共的内存大小
        float totalPhysicalMemorySize = Float.parseFloat(objectFormat(getTotalPhysicalMemorySize() / constm));
        float percent = Float.parseFloat(objectFormat((usedPhysicalMemorySize / totalPhysicalMemorySize * 100)));
        map.put("total", totalPhysicalMemorySize);
        map.put("use", usedPhysicalMemorySize);
        map.put("percent", percent);
        return map;
    }

//查询cpu
public static float getCpuPercent() throws IOException, BashException {
        Runtime runtime = Runtime.getRuntime();
        // 执行top命令,top是动态的,我们只要一次结果
        Process top = runtime.exec("top -b -n 1");
        BufferedReader buf = new BufferedReader(new InputStreamReader(top.getInputStream()));
        String str = "";
        float percent = 0;
        int line = 0;
        // 一行一行读
        while ((str = buf.readLine()) != null) {
            // 跳过第一和第二行
            line++;
            if (line == 1 || line == 2) {
                continue;
            }
            // 切割
            String[] split = str.split(" ");
            int length = split.length;
            percent = Float.parseFloat(split[length - 2]);
            break;
        }
        return percent;
    }
获取其他Linux服务器CPU内存硬盘等详细信息,可以使用Java Management Extensions (JMX) 技术来实现。具体实现步骤如下: 1. 添加依赖 在 Maven 项目中,需要添加以下依赖: ``` <dependency> <groupId>javax.management</groupId> <artifactId>jmxremote</artifactId> <version>1.0_01</version> </dependency> ``` 2. 启用JMX 在Linux服务器上启用JMX,可以通过添加以下JVM参数来实现: ``` -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false ``` 其中,`-Dcom.sun.management.jmxremote.port` 参数指定了JMX远程连接端口。 3. 编写Java代码 接下来,可以通过Java程序来连接Linux服务器上的JMX服务,获取服务器CPU内存硬盘等详细信息。以下是一个示例代码: ```java import java.util.Set; import javax.management.MBeanServerConnection; import javax.management.ObjectInstance; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; public class JMXDemo { public static void main(String[] args) throws Exception { // 连接JMX服务 JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"); JMXConnector connector = JMXConnectorFactory.connect(url, null); MBeanServerConnection connection = connector.getMBeanServerConnection(); // 获取服务器信息 ObjectName osName = new ObjectName("java.lang:type=OperatingSystem"); System.out.println("CPU使用率:" + connection.getAttribute(osName, "ProcessCpuLoad")); System.out.println("总内存:" + connection.getAttribute(osName, "TotalPhysicalMemorySize")); System.out.println("空闲内存:" + connection.getAttribute(osName, "FreePhysicalMemorySize")); ObjectName runtimeName = new ObjectName("java.lang:type=Runtime"); System.out.println("JVM启动时间:" + connection.getAttribute(runtimeName, "StartTime")); System.out.println("JVM运行时间:" + connection.getAttribute(runtimeName, "Uptime")); ObjectName memoryName = new ObjectName("java.lang:type=Memory"); System.out.println("Heap内存使用量:" + connection.getAttribute(memoryName, "HeapMemoryUsage")); System.out.println("Non-Heap内存使用量:" + connection.getAttribute(memoryName, "NonHeapMemoryUsage")); ObjectName threadName = new ObjectName("java.lang:type=Threading"); System.out.println("线程数:" + connection.getAttribute(threadName, "ThreadCount")); ObjectName diskName = new ObjectName("com.sun.management:type=OperatingSystem"); System.out.println("磁盘总空间:" + connection.getAttribute(diskName, "TotalPhysicalMemorySize")); System.out.println("磁盘可用空间:" + connection.getAttribute(diskName, "FreePhysicalMemorySize")); // 获取其他信息 Set<ObjectInstance> instances = connection.queryMBeans(null, null); for (ObjectInstance instance : instances) { System.out.println(instance.getObjectName()); } // 关闭连接 connector.close(); } } ``` 在上述代码中,需要将JMX连接地址中的 `localhost` 替换成目标Linux服务器的IP地址或主机名。另外,需要根据实际情况调整获取服务器信息的代码。 注意:在获取磁盘空间信息时,需要使用 `com.sun.management:type=OperatingSystem` 这个ObjectName,而不是 `java.lang:type=OperatingSystem`。如果使用前者,则需要添加以下依赖: ``` <dependency> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>com.sun.jmx</groupId> <artifactId>jmxri</artifactId> <version>1.2.1</version> </dependency> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值