Java获取系统CPU,磁盘占比,内存占比(系统自身监控状态)

系统自身监控状态

	突然心血来潮写一个这个文章,之前本来打算一天一更的,但是工作原因,搞得一直加班.....(算了,不想碎碎念了,只是把这个记录下来,方便以后自己回头看看。)

利用oshi工具获取信息

	本来吧,按理说是可以直接用的,但是开发环境是1.7的,结果不能直接弄,最终别人的帮助下改了一下套进了系统中最终跑起来了。

Java原生代码实现cpu,磁盘等数据占比

但是这个有一个缺点,就是本身获取的速度会很慢,请求接口的话,大概会有34s,<mark>所以慎重选择</mark>。

//获得cpu使用率:原生代码,响应时间大概30s
    public static String 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) * 1.0 / (busytime + idletime)).intValue();
            } else {
   
                return "" + 0 ;
            }
        } catch (Exception ex) {
   
            ex.printStackTrace();
            return "" + 0 ;
        }
    }

    private static long[] readCpu(final Process proc) {
   
		// TODO Auto-generated method stub
		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 =substring(line, capidx, cmdidx - 1).trim();
                String cmd = substring(line, cmdidx, kmtidx - 1).trim();
                if (cmd.indexOf("wmic.exe") >= 0) {
   
                    continue;
                }
                String s1 = substring(line, kmtidx, rocidx - 1).trim();
                String s2 = substring(line, umtidx, wocidx - 1).trim();
                if (caption.equals("System Idle Process") || caption.equals("System")) {
   
                    if (s1.length() > 0)
                        idletime += Long.valueOf(s1).longValue();
                    if (s2.length() > 0)
                        idletime += Long.valueOf(s2).longValue();
                    continue;
                }
                if (s1.length() > 0)
                    kneltime += Long.valueOf(s1).longValue();
                if (s2.length() > 0)
                    usertime += Long.valueOf(s2).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;
	}

    /** * 由于String.subString对汉字处理存在问题(把一个汉字视为一个字节),因此在 包含汉字的字符串时存在隐患,现调整如下: * @param src 要截取的字符串 * @param start_idx 开始坐标(包括该坐标) * @param end_idx 截止坐标(包括该坐标) * @return */
    private 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;
    }



        public static String getMemery() {
   
        OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
        // 总的物理内存+虚拟内存
        long totalvirtualMemory = osmxb.getTotalSwapSpaceSize();
        // 剩余的物理内存
        long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize();
        Double compare = (Double) (1 - freePhysicalMemorySize * 1.0 / totalvirtualMemory) * 100;
        String str = "" + compare.intValue();
        return str;
    }


利用第三方工具获取

很简单,导入然后套娃就可以了。


// oshi获取cpu数据,不支持低版本
	public static String getCpu() throws Exception{
   
		
		SystemInfo systemInfo = new SystemInfo();
		 CentralProcessor processor = systemInfo.getHardware().getProcessor();
	        long[] prevTicks = processor.getSystemCpuLoadTicks();
	        // 睡眠1s
	        TimeUnit.SECONDS.sleep(1);
	        long[] ticks = processor.getSystemCpuLoadTicks();
	        long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
	        long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
	        long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
	        long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
	        long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
	        long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
	        long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
	        long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
	        long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
		
	        String s = new DecimalFormat("#.##%").format(1-(idle * 1.0 / totalCpu));
	        
	        String newString = s.replace("%", "");
	        
	        return newString;
	        
	}



//获取内存使用率
	public static String getMemery(){
   
		
		SystemInfo systemInfo = new SystemInfo();
		GlobalMemory memory = systemInfo.getHardware().getMemory();
		//总内存
		long totalByte = memory.getTotal();
		//剩余
		long acaliableByte = memory.getAvailable();
		
		String string = new DecimalFormat("#.##%").format((totalByte-acaliableByte)*1.0/totalByte);
		String newString = string.replace("%", "");
		
		return newString;
	}




悟已往之不谏知来者之可追。
全部评论

相关推荐

双非坐过牢:非佬,可以啊10.28笔试,11.06评估11.11,11.12两面,11.19oc➕offer
点赞 评论 收藏
分享
尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务