获取当前jvm数据

简介: 获取当前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

相关文章
|
6月前
|
消息中间件 存储 Java
jvm性能调优实战 - 47超大数据量处理系统是如何OOM的
jvm性能调优实战 - 47超大数据量处理系统是如何OOM的
74 0
|
1月前
|
Java
jvm复习,深入理解java虚拟机一:运行时数据区域
这篇文章深入探讨了Java虚拟机的运行时数据区域,包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、元空间和运行时常量池,并讨论了它们的作用、特点以及与垃圾回收的关系。
60 19
jvm复习,深入理解java虚拟机一:运行时数据区域
|
24天前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
24 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
5月前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
63 2
|
6月前
|
存储 算法 Java
JVM 数据区域
JVM 数据区域
|
6月前
|
存储 Java 编译器
【JVM】运行时数据区域
【JVM】运行时数据区域
43 0
|
6月前
|
存储 算法 Java
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
53 0
|
6月前
|
存储 算法 Java
[JVM] 美团二面,说一下JVM数据区域
[JVM] 美团二面,说一下JVM数据区域
|
Arthas 消息中间件 监控
JVM第五讲:纵横数据如何应对洪峰推送
JVM第五讲:纵横数据如何应对洪峰推送
JVM第五讲:纵横数据如何应对洪峰推送
|
存储 Java 数据管理
【面试题精讲】JVM-运行时数据区-帧数据
【面试题精讲】JVM-运行时数据区-帧数据