原来获取Jvm信息如此简单

前言

当线上出现问题的时候,最最最重要的是定位问题。一旦定位到问题了,一切都好办了。但是这个定位问题,需要的不仅仅是理论知识,还需要丰富的实操经验。而丰富的经验从哪里来呢,就是对于工具的运用和数据的分析中来,接下来主要介绍一下java中如何去获取JVM跟os的信息?

下面让我们直接进入主题:

JAVA代码里如何去获取JVM/OS的运行信息呢?

  • Jvm信息使用ManagementFactory去获取
  • OS运行信息推荐使用oshi去获取
<dependency>
            <groupId>com.github.oshi</groupId>
            <artifactId>oshi-core</artifactId>
            <version>5.7.5</version>
</dependency>

获取jvm运行内存信息

格式化内存大小类

package io.github.quickmsg.metric.utils;

import java.text.DecimalFormat;

/**
 * @author coding途中
 */
public class FormatUtils {

    /**
     * 单位转换
     *
     * @param byteNumber number
     * @return desc
     */
   public static String formatByte(long byteNumber) {
        //换算单位
        double FORMAT = 1024.0;
        double kbNumber = byteNumber / FORMAT;
        if (kbNumber < FORMAT) {
            return new DecimalFormat("#.##KB").format(kbNumber);
        }
        double mbNumber = kbNumber / FORMAT;
        if (mbNumber < FORMAT) {
            return new DecimalFormat("#.##MB").format(mbNumber);
        }
        double gbNumber = mbNumber / FORMAT;
        if (gbNumber < FORMAT) {
            return new DecimalFormat("#.##GB").format(gbNumber);
        }
        double tbNumber = gbNumber / FORMAT;
        return new DecimalFormat("#.##TB").format(tbNumber);
    }
}

废话不多说直接上代码:

  • 第一个种方法通过ManagementFactory获取MemoryMXBean
MemoryMXBean mxb = ManagementFactory.getMemoryMXBean();
        //堆
System.out.println("Max:" +FormatUtils.formatByte(mxb.getHeapMemoryUsage().getMax()));    //Max:1776MB
System.out.println("Init:" + FormatUtils.formatByte(mxb.getHeapMemoryUsage().getInit()));  //Init:126MB
System.out.println("Committed:" + FormatUtils.formatByte(mxb.getHeapMemoryUsage().getCommitted()));   //Committed:121MB
System.out.println("Used:" + FormatUtils.formatByte(mxb.getHeapMemoryUsage().getUsed()));  //Used:7MB
System.out.println(mxb.getHeapMemoryUsage().toString());   
        //直接内存
System.out.println("Max:" +FormatUtils.formatByte(mxb.getNonHeapMemoryUsage().getMax()));    //Max:0MB
System.out.println("Init:" + FormatUtils.formatByte(mxb.getNonHeapMemoryUsage().getInit()));  //Init:2MB
System.out.println("Committed:" + FormatUtils.formatByte(mxb.getNonHeapMemoryUsage().getCommitted()));   //Committed:8MB
System.out.println("Used:" + FormatUtils.formatByte(mxb.getNonHeapMemoryUsage().getUsed()));  //Used:7MB
System.out.println(mxb.getNonHeapMemoryUsage().toString()); 
  • 使用Runtime对象去获取
JSONObject cpuInfo = new JSONObject();
Properties props = System.getProperties();
Runtime runtime = Runtime.getRuntime();
long jvmTotalMemoryByte = runtime.totalMemory();
long freeMemoryByte = runtime.freeMemory();
        //jvm总内存
cpuInfo.put("total", FormatUtils.formatByte(jvmTotalMemoryByte));
        //空闲空间
cpuInfo.put("free", FormatUtils.formatByte(freeMemoryByte));
        //jvm最大可申请
cpuInfo.put("max", FormatUtils.formatByte(runtime.maxMemory()));
        //jvm已使用内存
cpuInfo.put("user", FormatUtils.formatByte(jvmTotalMemoryByte - freeMemoryByte));
        //jvm内存使用率
cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((jvmTotalMemoryByte - freeMemoryByte) * 1.0 / jvmTotalMemoryByte));
        //jdk版本
cpuInfo.put("jdkVersion", props.getProperty("java.version"));
        //jdk路径
cpuInfo.put("jdkHome", props.getProperty("java.home"));
        
System.out.println(cpuInfo);

获取jvm运行线程信息

ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
Map<String, Number> map = new LinkedHashMap<String, Number>();
// 线程总数
map.put("jvm.thread.count", threadBean.getThreadCount());
// 守护线程总数
map.put("jvm.thread.daemon.count", threadBean.getDaemonThreadCount());
// 开启线程总数
map.put("jvm.thread.totalstarted.count", threadBean.getTotalStartedThreadCount());
// 获取线程详细信息
ThreadInfo[] threadInfos = threadBean.getThreadInfo(threadBean.getAllThreadIds(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值