java获取jvm内存信息 java获取jvm运行信息 java获取jvm运行信息
1、创建需要使用的工具类
文件名 ByteConverter.java
用于将字节数值转为 MB数值
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* <h2>字节数值转换</h2>
* <p>
*
* </p>
*
* @author 作者<1922802352@qq.com>
* @since 2023年01月12日 下午4:14:02
**/
public class ByteConverter {
/**
* 将字节数量转换为MB
*
* @param bytes 字节数量
* @return 对应的MB
*/
public static BigDecimal bytesToMB(long bytes) {
BigDecimal bytesConver = BigDecimal.valueOf(bytes);
// 字节数量转换MB = 字节数 / (1024 * 1024)
BigDecimal conditions = BigDecimal.valueOf(1048576L);
return bytesConver.divide(conditions, 2, RoundingMode.HALF_UP);
}
}
可选
有些地方使用到了 hutool
工具类,在代码中会有注释标注哪些地方使用,不使用hutool工具也可以,但是需要自己实现特定工具
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
2、创建一个 jvm信息对象类
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Singleton;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
/**
* <h2>JVM运行信息</h2>
* <p>
*
* </p>
*
* @author 作者<1922802352@qq.com>
* @since 2023年01月12日 下午4:14:02
**/
public class JvmInfo {
/**
* 单例模式,使用 hutool工具,也可以自己实现,也可以直接不用单例模式 直接new
*/
private static JvmInfo info = Singleton.get(JvmInfo.class);
/**
* JVM已用内存
*/
private BigDecimal usedMemory;
/**
* JVM最大可用内存
*/
private BigDecimal maxMemory;
/**
* JVM剩余内存
*/
private BigDecimal freeMemory;
/**
* jdk安装路径
*/
private String jdkHome;
/**
* jdk版本
*/
private String jdkVersion;
/**
* jdk名称
*/
private String jdkName;
/**
* 程序启动时间
*/
private String startTime;
/**
* 已运行时间
*/
private String elapsedTime;
/**
* 运行参数
*/
private String runParamters;
/**
* JVM内存使用率
*/
private BigDecimal usage;
private JvmInfo(){}
public static JvmInfo getInstance() {
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
// jvm最大可用内存
info.setMaxMemory(ByteConverter.bytesToMB(heapMemoryUsage.getMax()));
// jvm已使用内存
info.setUsedMemory(ByteConverter.bytesToMB(heapMemoryUsage.getUsed()));
// jvm剩余内存
info.setFreeMemory(info.getMaxMemory().subtract(info.getUsedMemory()));
// jvm内存使用率
info.setUsage(info.getUsedMemory().divide(info.getMaxMemory(), 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")));
// jdk版本
info.setJdkVersion(System.getProperty("java.version"));
// jdk安装路径
info.setJdkHome(System.getProperty("java.home"));
// jdk名称
info.setJdkName(runtimeMXBean.getVmName());
// 程序运行时间
Instant instant = Instant.ofEpochMilli(runtimeMXBean.getStartTime());
info.setStartTime(LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toString().replace("T", " "));
// 程序已运行时间
info.setElapsedTime(getDatePoor(System.currentTimeMillis(), runtimeMXBean.getStartTime()));
return info;
}
/**
* 获取两个时间的差值(用于计算JVM运行时间)
*
* @param currentTime 大的那个时间
* @param startTime 小的那个时间
* @return 返回差的时间字符
*/
private static String getDatePoor( long currentTime, long startTime) {
// 获得两个时间的毫秒时间差异
long diff = currentTime - startTime;
// 输出结果为 XX天XX时XX分XX秒, 使用 hutool工具,不使用huttol 请使用方式实现计算 两个时间相差值
return DateUtil.formatBetween(diff);
}
public String getJdkName() {
return jdkName;
}
public void setJdkName(String jdkName) {
this.jdkName = jdkName;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getElapsedTime() {
return elapsedTime;
}
public void setElapsedTime(String elapsedTime) {
this.elapsedTime = elapsedTime;
}
public String getRunParamters() {
return runParamters;
}
public void setRunParamters(String runParamters) {
this.runParamters = runParamters;
}
public String getJdkVersion() {
return jdkVersion;
}
public void setJdkVersion(String jdkVersion) {
this.jdkVersion = jdkVersion;
}
public BigDecimal getUsage() {
return usage;
}
public void setUsage(BigDecimal usage) {
this.usage = usage;
}
public BigDecimal getUsedMemory() {
return usedMemory;
}
public void setUsedMemory(BigDecimal usedMemory) {
this.usedMemory = usedMemory;
}
public BigDecimal getMaxMemory() {
return maxMemory;
}
public void setMaxMemory(BigDecimal maxMemory) {
this.maxMemory = maxMemory;
}
public BigDecimal getFreeMemory() {
return freeMemory;
}
public void setFreeMemory(BigDecimal freeMemory) {
this.freeMemory = freeMemory;
}
public String getJdkHome() {
return jdkHome;
}
public void setJdkHome(String jdkHome) {
this.jdkHome = jdkHome;
}
}
3、使用
public static void main(String[] args) {
System.out.printf("JVM运行信息:%s", JvmInfo.getInstans());
}