`

JAVA获取系统信息

阅读更多
从论坛里转载的,留着备查。 求的JVM本身的... ...
[code="javaimport java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.StringTokenizer;

import sun.management.ManagementFactory;

import com.sun.management.OperatingSystemMXBean;


public class MonitorServiceImpl implements IMonitorService{

private static final int CPUTIME = 30;   
 
    private static final int PERCENT = 100;   
 
    private static final int FAULTLENGTH = 10;   
     
    private static final File versionFile = new File("/proc/version");   
    private static String linuxVersion = null;   
 
    /**  
     * 获得当前的监控对象.  
     * @return 返回构造好的监控对象  
     * @throws Exception  
     * @author GuoHuang  
     */   
    public MonitorInfoBean getMonitorInfoBean() throws Exception {   
        int kb = 1024;   
         
        // 可使用内存   
        long totalMemory = Runtime.getRuntime().totalMemory() / kb;   
        // 剩余内存   
        long freeMemory = Runtime.getRuntime().freeMemory() / kb;   
        // 最大可使用内存   
        long maxMemory = Runtime.getRuntime().maxMemory() / kb;   
 
        OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory   
                .getOperatingSystemMXBean();   
 
        // 操作系统   
        String osName = System.getProperty("os.name");   
        // 总的物理内存   
        long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;   
        // 剩余的物理内存   
        long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;   
        // 已使用的物理内存   
        long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb   
                .getFreePhysicalMemorySize())   
                / kb;   
 
        // 获得线程总数   
        ThreadGroup parentThread;   
        for (parentThread = Thread.currentThread().getThreadGroup(); parentThread   
                .getParent() != null; parentThread = parentThread.getParent())   
            ;   
        int totalThread = parentThread.activeCount();   
 
        double cpuRatio = 0;   
        if (osName.toLowerCase().startsWith("windows")) {   
            cpuRatio = this.getCpuRatioForWindows();   
        }   
        else {   
         cpuRatio = this.getCpuRateForLinux();   
        }   
         
        // 构造返回对象   
        MonitorInfoBean infoBean = new MonitorInfoBean();   
        infoBean.setFreeMemory(freeMemory);   
        infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);   
        infoBean.setMaxMemory(maxMemory);   
        infoBean.setOsName(osName);   
        infoBean.setTotalMemory(totalMemory);   
        infoBean.setTotalMemorySize(totalMemorySize);   
        infoBean.setTotalThread(totalThread);   
        infoBean.setUsedMemory(usedMemory);   
        infoBean.setCpuRatio(cpuRatio);   
        return infoBean;   
    }   
    private static double getCpuRateForLinux(){   
        InputStream is = null;   
        InputStreamReader isr = null;   
        BufferedReader brStat = null;   
        StringTokenizer tokenStat = null;   
        try{   
            System.out.println("Get usage rate of CUP , linux version: "+linuxVersion);   
 
            Process process = Runtime.getRuntime().exec("top -b -n 1");   
            is = process.getInputStream();                     
            isr = new InputStreamReader(is);   
            brStat = new BufferedReader(isr);   
             
            if(linuxVersion.equals("2.4")){   
                brStat.readLine();   
                brStat.readLine();   
                brStat.readLine();   
                brStat.readLine();   
                 
                tokenStat = new StringTokenizer(brStat.readLine());   
                tokenStat.nextToken();   
                tokenStat.nextToken();   
                String user = tokenStat.nextToken();   
                tokenStat.nextToken();   
                String system = tokenStat.nextToken();   
                tokenStat.nextToken();   
                String nice = tokenStat.nextToken();   
                 
                System.out.println(user+" , "+system+" , "+nice);   
                 
                user = user.substring(0,user.indexOf("%"));   
                system = system.substring(0,system.indexOf("%"));   
                nice = nice.substring(0,nice.indexOf("%"));   
                 
                float userUsage = new Float(user).floatValue();   
                float systemUsage = new Float(system).floatValue();   
                float niceUsage = new Float(nice).floatValue();   
                 
                return (userUsage+systemUsage+niceUsage)/100;   
            }else{   
                brStat.readLine();   
                brStat.readLine();   
                     
                tokenStat = new StringTokenizer(brStat.readLine());   
                tokenStat.nextToken();   
                tokenStat.nextToken();   
                tokenStat.nextToken();   
                tokenStat.nextToken();   
                tokenStat.nextToken();   
                tokenStat.nextToken();   
                tokenStat.nextToken();   
                String cpuUsage = tokenStat.nextToken();   
                     
                 
                System.out.println("CPU idle : "+cpuUsage);   
                Float usage = new Float(cpuUsage.substring(0,cpuUsage.indexOf("%")));   
                 
                return (1-usage.floatValue()/100);   
            }   
 
              
        } catch(IOException ioe){   
            System.out.println(ioe.getMessage());   
            freeResource(is, isr, brStat);   
            return 1;   
        } finally{   
            freeResource(is, isr, brStat);   
        }   
 
    }   
    private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br){   
        try{   
            if(is!=null)   
                is.close();   
            if(isr!=null)   
                isr.close();   
            if(br!=null)   
                br.close();   
        }catch(IOException ioe){   
            System.out.println(ioe.getMessage());   
        }   
    }   
 
 
    /**  
     * 获得CPU使用率.  
     * @return 返回cpu使用率  
     * @author GuoHuang  
     */   
    private double getCpuRatioForWindows() {   
        try {   
            String procCmd = System.getenv("windir")   
                    + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine,"   
                    + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";   
            // 取进程信息   
            long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd));   
            Thread.sleep(CPUTIME);   
            long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd));   
            if (c0 != null && c1 != null) {   
                long idletime = c1[0] - c0[0];   
                long busytime = c1[1] - c0[1];   
                return Double.valueOf(   
                        PERCENT * (busytime) / (busytime + idletime))   
                        .doubleValue();   
            } else {   
                return 0.0;   
            }   
        } catch (Exception ex) {   
            ex.printStackTrace();   
            return 0.0;   
        }   
    }   
 
    /**       

* 读取CPU信息.  
     * @param proc  
     * @return  
     * @author GuoHuang  
     */   
    private long[] readCpu(final Process proc) {   
        long[] retn = new long[2];   
        try {   
            proc.getOutputStream().close();   
            InputStreamReader ir = new InputStreamReader(proc.getInputStream());   
            LineNumberReader input = new LineNumberReader(ir);   
            String line = input.readLine();   
            if (line == null || line.length() < FAULTLENGTH) {   
                return null;   
            }   
            int capidx = line.indexOf("Caption");   
            int cmdidx = line.indexOf("CommandLine");   
            int rocidx = line.indexOf("ReadOperationCount");   
            int umtidx = line.indexOf("UserModeTime");   
            int kmtidx = line.indexOf("KernelModeTime");   
            int wocidx = line.indexOf("WriteOperationCount");   
            long idletime = 0;   
            long kneltime = 0;   
            long usertime = 0;   
            while ((line = input.readLine()) != null) {   
                if (line.length() < wocidx) {   
                    continue;   
                }   
                // 字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount,   
                // ThreadCount,UserModeTime,WriteOperation   
                String caption = Bytes.substring(line, capidx, cmdidx - 1)   
                        .trim();   
                String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim();   
                if (cmd.indexOf("wmic.exe") >= 0) {   
                    continue;   
                }   
                // log.info("line="+line);   
                if (caption.equals("System Idle Process")   
                        || caption.equals("System")) {   
                    idletime += Long.valueOf(   
                            Bytes.substring(line, kmtidx, rocidx - 1).trim())   
                            .longValue();   
                    idletime += Long.valueOf(   
                            Bytes.substring(line, umtidx, wocidx - 1).trim())   
                            .longValue();   
                    continue;   
                }   
 
                kneltime += Long.valueOf(   
                        Bytes.substring(line, kmtidx, rocidx - 1).trim())   
                        .longValue();   
                usertime += Long.valueOf(   
                        Bytes.substring(line, umtidx, wocidx - 1).trim())   
                        .longValue();   
            }   
            retn[0] = idletime;   
            retn[1] = kneltime + usertime;   
            return retn;   
        } catch (Exception ex) {   
            ex.printStackTrace();   
        } finally {   
            try {   
                proc.getInputStream().close();   
            } catch (Exception e) {   
                e.printStackTrace();   
            }   
        }   
        return null;   
    }   

   
public static void main(String[] args) throws Exception{
IMonitorService service = new MonitorServiceImpl();   
        MonitorInfoBean monitorInfo = service.getMonitorInfoBean();   
        System.out.println("cpu占有率=" + monitorInfo.getCpuRatio());   
         
        System.out.println("可使用内存=" + monitorInfo.getTotalMemory());   
        System.out.println("剩余内存=" + monitorInfo.getFreeMemory());   
        System.out.println("最大可使用内存=" + monitorInfo.getMaxMemory());   
         
        System.out.println("操作系统=" + monitorInfo.getOsName());   
        System.out.println("总的物理内存=" + monitorInfo.getTotalMemorySize() + "kb");   
        System.out.println("剩余的物理内存=" + monitorInfo.getFreeMemory() + "kb");   
        System.out.println("已使用的物理内存=" + monitorInfo.getUsedMemory() + "kb");   
        System.out.println("线程总数=" + monitorInfo.getTotalThread() + "kb");   

}  

}

class Bytes {   
    public static String substring(String src, int start_idx, int end_idx){   
        byte[] b = src.getBytes();   
        String tgt = "";   
        for(int i=start_idx; i<=end_idx; i++){   
            tgt +=(char)b[i];   
        }   
        return tgt;   
    }   
}

class MonitorInfoBean {   
    /** 可使用内存. */   
    private long totalMemory;   
     
    /**  剩余内存. */   
    private long freeMemory;   
     
    /** 最大可使用内存. */   
    private long maxMemory;   
     
    /** 操作系统. */   
    private String osName;   
     
    /** 总的物理内存. */   
    private long totalMemorySize;   
     
    /** 剩余的物理内存. */   
    private long freePhysicalMemorySize;   
     
    /** 已使用的物理内存. */   
    private long usedMemory;   
     
    /** 线程总数. */   
    private int totalThread;   
     
    /** cpu使用率. */   
    private double cpuRatio;   
 
    public long getFreeMemory() {   
        return freeMemory;   
    }   
 
    public void setFreeMemory(long freeMemory) {   
        this.freeMemory = freeMemory;   
    }   
 
    public long getFreePhysicalMemorySize() {   
        return freePhysicalMemorySize;   
    }   
 
    public void setFreePhysicalMemorySize(long freePhysicalMemorySize) {   
        this.freePhysicalMemorySize = freePhysicalMemorySize;   
    }   
 
    public long getMaxMemory() {   
        return maxMemory;   
    }   
 
    public void setMaxMemory(long maxMemory) {   
        this.maxMemory = maxMemory;   
    }   
 
    public String getOsName() {   
        return osName;   
    }   
 
    public void setOsName(String osName) {   
        this.osName = osName;   
    }   
 
    public long getTotalMemory() {   
        return totalMemory;   
    }   
 
    public void setTotalMemory(long totalMemory) {   
        this.totalMemory = totalMemory;   
    }   
 
    public long getTotalMemorySize() {   
        return totalMemorySize;   
    }   
 
    public void setTotalMemorySize(long totalMemorySize) {   
        this.totalMemorySize = totalMemorySize;   
    }   
 
    public int getTotalThread() {   
        return totalThread;   
    }   
 
    public void setTotalThread(int totalThread) {   
        this.totalThread = totalThread;   
    }   
 
    public long getUsedMemory() {   
        return usedMemory;   
    }   
 
    public void setUsedMemory(long usedMemory) {   
        this.usedMemory = usedMemory;   
    }   
 
    public double getCpuRatio() {   
        return cpuRatio;   
    }   
 
    public void setCpuRatio(double cpuRatio) {   
        this.cpuRatio = cpuRatio;   
    }   
}   


interface IMonitorService {   
    public MonitorInfoBean getMonitorInfoBean() throws Exception;   
 
}    code]

   其中用到了探针
分享到:
评论

相关推荐

    Java获取系统信息

    Java 获取系统信息 Java 获取系统信息是指通过 Java 语言来获取系统的各种信息,包括 CPU 信息、内存信息、硬盘信息、进程信息等。在 Java 中,我们可以使用多种方式来获取系统信息,如使用 Runtime 类、System 类...

    linux 下用java 获取系统信息 cpu mem jvm等

    linux 下用java 获取系统信息 cpu mem jvm等 用java调用系统命令得到,方便实用

    Java获取系统信息(cpu,内存,硬盘,进程等)的相关方法.pdf

    Java 获取系统信息(CPU、内存、硬盘、进程等)的相关方法 Java 获取系统信息是指通过 Java 语言获取当前系统的各种信息,包括 CPU、内存、硬盘、进程等。下面将介绍两种获取系统信息的方法。 方法一:使用 Java ...

    java获取系统信息的类文件

    在Java编程语言中,获取系统信息是常见的需求,这包括但不限于系统内存的使用...以上就是使用Java获取系统信息的主要类和方法的概述。在实际开发中,需要根据具体的需求和目标平台选择合适的方式来获取和处理这些信息。

    Java获取系统信息(cpu_内存_硬盘_进程等)的相关方法

    Java 获取系统信息(CPU、内存、硬盘、进程等)的相关方法 Java 获取系统信息是指通过 Java 语言获取当前系统的各种信息,包括 CPU 信息、内存信息、硬盘信息、进程信息等。在实际开发中,这些信息往往是非常有用的...

    Java 获取系统信息,包括CPU使用率、硬盘大小、网卡状态、系统信息等

    本篇文章将探讨如何利用Java获取CPU使用率、硬盘大小、网卡状态以及更广泛的系统信息。我们将主要关注一个名为"libsigar-x86-linux.so"的库文件,这是一个跨平台的系统信息获取工具——Sigar(System Information ...

    Java获取操作系统信息

    在Java编程语言中,获取操作系统的信息是一项常见的任务,这有助于开发者了解程序运行的环境,进行兼容性检查,或者根据不同的操作...通过实践和学习,你可以更好地掌握Java获取操作系统信息的技巧,提升你的开发能力。

    使用java获取系统信息machineInfo-master.zip

    本项目"machineInfo-master"显然是一个用于展示如何利用Java获取系统信息的示例代码库。下面我们将详细讨论如何在Java中获取系统信息,并基于提供的文件名"machineInfo-master"推测可能包含的内容。 1. **Java的`...

    java获取当前系统信息

    ### 操作系统信息 操作系统相关的属性提供了对运行Java程序的主机操作系统的深入了解: - **操作系统名称**:`os.name`,如“Linux”、“Windows 10”等。 - **操作系统架构**:`os.arch`,显示了操作系统的架构...

    一个非常不错的用JAVA获得系统信息的包

    标题中的“一个非常不错的用JAVA获得系统信息的包”指的是使用Java编程语言获取计算机系统信息的工具或库。这样的工具通常允许开发者通过代码获取到操作系统、硬件和网络等多方面的详细信息,便于监控、分析和优化...

    java获取系统信息(cpu,内存,硬盘)方法及jar包

    在Java编程中,获取系统信息是一项重要的任务,特别是在系统监控、性能分析以及资源管理等领域。本文将详细讲解如何使用Java来获取CPU、内存、硬盘等系统信息,以及如何读取IP地址和网络接口信息。我们将重点介绍`...

    Java获取系统信息(cpu,内存,硬盘,进程等)的相关方法

    ### Java 获取系统信息(CPU,内存,硬盘,进程等)的相关方法 在现代软件开发过程中,经常需要获取运行环境的一些基本信息,例如CPU使用率、内存使用情况、硬盘占用空间以及进程状态等。这些信息对于系统监控、...

    java获取系统、硬件、设备相关信息

    java 1. 使用wmic相关命令获取windows硬件相关信息。 2. 使用shell相关的dmidecode/fdisk/ifconfig命令获取Linux硬件和系统相关信息

    java版获取本地系统信息的源码工程

    在Java编程语言中,获取本地系统信息是一项常用的任务...通过学习和理解这个源码工程,开发者可以掌握Java获取系统信息的基本方法,进一步可以应用于性能监控、故障排查、日志记录等场景,提升软件的稳定性和可维护性。

    Java获取系统CPU、内存、硬盘等系统信息

    本文将详细探讨如何利用Java获取Windows和Linux系统的CPU、内存以及硬盘信息。 首先,让我们聚焦于CPU信息的获取。在Java中,`java.lang.management`包提供了ManagementFactory类,它包含了获取系统管理信息的方法...

    关于java获取操作系统信息

    在Java编程语言中,获取操作系统的信息对于环境配置、程序...开发人员可以根据需要选择合适的系统属性来获取所需的操作系统信息和其他关键数据。此外,理解这些属性的具体含义也有助于更高效地利用Java语言的各种特性。

    java获取操作系统版本代码

    如果需要获取更详细的系统信息,如CPU使用率、系统负载等,可以使用`java.lang.management.ManagementFactory`创建的`OperatingSystemMXBean`实例。例如: ```java OperatingSystemMXBean osBean = ...

Global site tag (gtag.js) - Google Analytics