• 获取当前jvm数据


    获取当前jvm数据
    import java.io.InputStreamReader;
    import java.io.LineNumberReader;
    import java.lang.management.ManagementFactory;
    
    import org.apache.log4j.Logger;
    
    import com.sun.management.OperatingSystemMXBean;
    
    public class MonitorUtil {
        private static final Logger logger = Logger.getLogger(MonitorUtil.class);
        //可以设置长些,防止读到运行此次系统检查时的cpu占用率,就不准了  
        private static final int CPUTIME = 5000;  
      
        private static final int PERCENT = 100;  
      
        private static final int FAULTLENGTH = 10;  
      
        /** *//** 
         * 获得当前的监控对象. 
         */  
        public static String 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 = getCpuRatioForWindows();  
            }  
              
            StringBuffer sb = new StringBuffer();
            double total = (Runtime.getRuntime().totalMemory()) / (1024.0 * 1024);
            double max = (Runtime.getRuntime().maxMemory()) / (1024.0 * 1024);
            double free = (Runtime.getRuntime().freeMemory()) / (1024.0 * 1024);
            logger.info("Java 虚拟机试图使用的最大内存量(当前JVM的最大可用内存) maxMemory(): " + max + "MB<br/>");
            logger.info("Java 虚拟机中的内存总量(当前JVM占用的内存总数) totalMemory(): " + total + "MB<br/>");
            logger.info("Java 虚拟机中的空闲内存量(当前JVM空闲内存) freeMemory(): " + free + "MB<br/>");
            logger.info("因为JVM只有在需要内存时才占用物理内存使用,所以freeMemory()的值一般情况下都很小,<br/>" +
            "而JVM实际可用内存并不等于freeMemory(),而应该等于 maxMemory() - totalMemory() + freeMemory()。<br/>");
            logger.info("JVM实际可用内存: " + (max - total + free) + "MB<br/>");
            logger.info("cpu占有率=" + cpuRatio+"/n");
            logger.info("可使用内存=" + totalMemory+"/n");  
            logger.info("剩余内存=" + freeMemory+"/n");  
            logger.info("最大可使用内存=" + maxMemory+"/n");  
              
            logger.info("操作系统=" + osName+"/n");  
            logger.info("总的物理内存=" + totalMemorySize + "kb/n");  
            logger.info("剩余的物理内存=" + freeMemory + "kb/n");  
            logger.info("已使用的物理内存=" + usedMemory + "kb/n");  
            logger.info("线程总数=" + totalThread+ "/n");  
            return sb.toString();  
        }  
      
        /** *//** 
         * 获得CPU使用率. 
         */  
        private static 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信息. 
       */  
        private static 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 = substring(line, capidx, cmdidx - 1)  
                            .trim();  
                    String cmd = 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(  
                                substring(line, kmtidx, rocidx - 1).trim())  
                                .longValue();  
                        idletime += Long.valueOf(  
                                substring(line, umtidx, wocidx - 1).trim())  
                                .longValue();  
                        continue;  
                    }  
      
                    kneltime += Long.valueOf(  
                            substring(line, kmtidx, rocidx - 1).trim())  
                            .longValue();  
                    usertime += Long.valueOf(  
                            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;  
        }  
            /** *//** 
             * 由于String.subString对汉字处理存在问题: 
             * @param src 要截取的字符串 
             * @param start_idx 开始坐标(包括该坐标) 
             * @param end_idx   截止坐标(包括该坐标) 
             * @return 
             */  
            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;  
            }  
       }
    View Code
  • 相关阅读:
    1003 我要通过! (20 分)
    安装ANSYS19.0的正确方法(附下载)
    多项式最小二乘法拟合
    递归循环嵌套排列组合
    对二维数组使用指针进行操作的探索(C语言)
    统计C语言关键字出现次数
    三次样条插值matlab实现
    绩点换算小程序
    B1020 月饼(25 分)
    问题 B: 分组统计
  • 原文地址:https://www.cnblogs.com/liangblog/p/13608816.html
Copyright © 2020-2023  润新知