前言
当线上出现问题的时候,最最最重要的是定位问题。一旦定位到问题了,一切都好办了。但是这个定位问题,需要的不仅仅是理论知识,还需要丰富的实操经验。而丰富的经验从哪里来呢,就是对于工具的运用和数据的分析中来,接下来主要介绍一下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.getAllT