在项目收集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;
}