java 获取jvm运行状态

在项目收集jvm运行状态信息并上传到监控平台是必要的,这样有利于我们分析服务器的运行情况,好让我们对一些潜在的威胁采取相关措施。

首先要了解到ManagementFactory这个类,它是java.lang.Object包下的
java.lang.management.ManagementFactory类。

它是ManagementFactory 类是一种工厂类,用于获取 Java 平台的管理 Bean。此类由静态方法组成,每种静态方法都会返回一个或多个表示 Java 虚拟机组件的管理接口的平台 MXBean。

各种MXBean:
这里写图片描述

这里我们想要获得jvm运行的参数需使用RuntimeMXBean类
RuntimeMXBean的各种方法如下:
这里写图片描述

代码如下:

JVM实体类
public class  JVMInfo implements Serializable(){

  private static final long serialVersionUID = 7593745554626593803L;

    /**
     * JVM 启动时间
     */
    private String jvmStartTime;
    /**
     * JVM 版本信息
     */
    private String jvmVersion;
    /**
     * jvm名称
     */
    private String jvmName;
    /**
     * 当前线程ID
     */
    private String processId;
    /**
     * 非堆内存使用情况(MB)
     */
    private MemoryUsageMB nonHeapMemoryUsage;
    /**
     * 堆内存使用情况(MB)
     */
    private MemoryUsageMB heapMemoryUsage;
    /**
     * 操作系统名称
     */
    private String osName;
    /**
     * 操作系统版本
     */
    private String osVersion;
    /**
     * 机器总内存(MB)
     */
    private long totalPhysicalMenory;
    /**
     * 机器以使用内存(MB)
     */
    private long freePhysicalMenory;
    /**
     * 机器可用内存比例
     */
    private String freePhysicalMenoryRatio;
    /**
     * CPU内核
     */
    private int processors;

    private String systemUpTime;

    public String getJvmStartTime() {
        return jvmStartTime;
    }

    public void setJvmStartTime(String jvmStartTime) {
        this.jvmStartTime = jvmStartTime;
    }

    public String getJvmVersion() {
        return jvmVersion;
    }

    public void setJvmVersion(String jvmVersion) {
        this.jvmVersion = jvmVersion;
    }

    public String getJvmName() {
        return jvmName;
    }

    public void setJvmName(String jvmName) {
        this.jvmName = jvmName;
    }

    public String getProcessId() {
        return processId;
    }

    public void setProcessId(String processId) {
        this.processId = processId;
    }

    public MemoryUsageMB getNonHeapMemoryUsage() {
        return nonHeapMemoryUsage;
    }

    public void setNonHeapMemoryUsage(MemoryUsageMB nonHeapMemoryUsage) {
        this.nonHeapMemoryUsage = nonHeapMemoryUsage;
    }

    public MemoryUsageMB getHeapMemoryUsage() {
        return heapMemoryUsage;
    }

    public void setHeapMemoryUsage(MemoryUsageMB heapMemoryUsage) {
        this.heapMemoryUsage = heapMemoryUsage;
    }

    public String getOsName() {
        return osName;
    }

    public void setOsName(String osName) {
        this.osName = osName;
    }

    public String getOsVersion() {
        return osVersion;
    }

    public void setOsVersion(String osVersion) {
        this.osVersion = osVersion;
    }

    public long getTotalPhysicalMenory() {
        return totalPhysicalMenory;
    }

    public void setTotalPhysicalMenory(long totalPhysicalMenory) {
        this.totalPhysicalMenory = totalPhysicalMenory;
    }

    public long getFreePhysicalMenory() {
        return freePhysicalMenory;
    }

    public void setFreePhysicalMenory(long freePhysicalMenory) {
        this.freePhysicalMenory = freePhysicalMenory;
    }

    public int getProcessors() {
        return processors;
    }

    public void setProcessors(int processors) {
        this.processors = processors;
    }

    public String getFreePhysicalMenoryRatio() {
        return freePhysicalMenoryRatio;
    }

    public void setFreePhysicalMenoryRatio(String freePhysicalMenoryRatio) {
        this.freePhysicalMenoryRatio = freePhysicalMenoryRatio;
    }

    public String getSystemUpTime() {
        return systemUpTime;
    }

    public void setSystemUpTime(String systemUpTime) {
        this.systemUpTime = systemUpTime;
    }

}

获取jvm信息并封装到JVMInfo实体类中
public JVMInfo getJVMInfo(){
    JVMInfo jvmStatus = new JVMInfo();
        try {
            //获取JVM的启动时间,版本及名称,当前进程ID
            RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
            jvmStatus.setJvmStartTime(simpleDateFormat.format(new Date(runtimeMXBean.getStartTime())));
            jvmStatus.setJvmVersion(runtimeMXBean.getVmVersion());
            jvmStatus.setJvmName(runtimeMXBean.getVmName());
            jvmStatus.setProcessId(runtimeMXBean.getName().split("@")[0]);

            //获取JVM内存使用状况,包括堆内存和非堆内存
            MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
            jvmStatus.setNonHeapMemoryUsage(buildMemoryUsageMB(memoryMXBean.getNonHeapMemoryUsage()));
            jvmStatus.setHeapMemoryUsage(buildMemoryUsageMB(memoryMXBean.getHeapMemoryUsage()));

            //操作系统及硬件信息:系统名称、版本,CPU内核,机器总内存、可用内存、可用内存占比
            OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
            jvmStatus.setOsName(operatingSystemMXBean.getName());
            jvmStatus.setOsVersion(operatingSystemMXBean.getVersion());
            jvmStatus.setProcessors(operatingSystemMXBean.getAvailableProcessors());
            jvmStatus.setTotalPhysicalMenory(operatingSystemMXBean.getTotalPhysicalMemorySize() / MBYTE);
            jvmStatus.setFreePhysicalMenory(operatingSystemMXBean.getFreePhysicalMemorySize() / MBYTE);
            DecimalFormat decimalFormat = new DecimalFormat("0.00%");
            if (operatingSystemMXBean.getTotalPhysicalMemorySize() > 0) {
                jvmStatus.setFreePhysicalMenoryRatio(decimalFormat.format(Double.valueOf(operatingSystemMXBean.getFreePhysicalMemorySize()) / operatingSystemMXBean.getTotalPhysicalMemorySize()));
            }

            jvmStatus.setSystemUpTime(this.getSystemUpTime());
        }catch (Exception e){

        }
        return jvmStatus;
 }

猜你喜欢

转载自blog.csdn.net/CSDNzhangtao5/article/details/72625082