package com.app.mvc.schedule.jobs;
import com.app.mvc.schedule.AbstractScheduleJob;
import com.sun.management.OperatingSystemMXBean;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import sun.management.ManagementFactoryHelper;
import java.lang.management.CompilationMXBean;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ThreadMXBean;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
* Created by jimin on 16/4/23.
*/
@Slf4j
public class SystemMonitorJob extends AbstractScheduleJob {
@Override
public void schedule(JobExecutionContext context) throws JobExecutionException {
StringBuilder sb = new StringBuilder();
sb.append("\n==========================通过java来获取相关系统状态========================== ");
sb.append("\n总的内存量: " + (Runtime.getRuntime().totalMemory() / 1024));//Java 虚拟机中的内存总量,以字节为单位
sb.append("\n空闲内存量: " + (Runtime.getRuntime().freeMemory() / 1024));//Java 虚拟机中的空闲内存量
sb.append("\n最大内存量: " + (Runtime.getRuntime().maxMemory() / 1024));
//获取操作系统相关信息
sb.append("\n=============================获取操作系统相关信息============================ ");
OperatingSystemMXBean osm = (OperatingSystemMXBean) ManagementFactoryHelper.getOperatingSystemMXBean();
sb.append("\n" + osm.getFreeSwapSpaceSize() / 1024);
sb.append("\n" + osm.getFreePhysicalMemorySize() / 1024);
sb.append("\n" + osm.getTotalPhysicalMemorySize() / 1024);
sb.append("\narch: " + osm.getArch());
sb.append("\navailableProcessors: " + osm.getAvailableProcessors());
sb.append("\ncommittedVirtualMemorySize: " + osm.getCommittedVirtualMemorySize());
sb.append("\nname: " + osm.getName());
sb.append("\nprocessCpuTime: " + osm.getProcessCpuTime());
sb.append("\nversion: " + osm.getVersion());
//获取整个虚拟机内存使用情况
sb.append("\n==========================获取整个虚拟机内存使用情况=========================== ");
MemoryMXBean mm = ManagementFactoryHelper.getMemoryMXBean();
sb.append("\nheapMemoryUsage: " + mm.getHeapMemoryUsage());
sb.append("\nnonHeapMemoryUsage: " + mm.getNonHeapMemoryUsage());
//获取各个线程的各种状态,CPU 占用情况,以及整个系统中的线程状况
sb.append("\n============获取各个线程的各种状态,CPU 占用情况,以及整个系统中的线程状况========== ");
ThreadMXBean tm = ManagementFactoryHelper.getThreadMXBean();
sb.append("\nthreadCount: " + tm.getThreadCount());
sb.append("\npeakThreadCount: " + tm.getPeakThreadCount());
sb.append("\ncurrentThreadCpuTime: " + tm.getCurrentThreadCpuTime());
sb.append("\ndaemonThreadCount: " + tm.getDaemonThreadCount());
sb.append("\ncurrentThreadUserTime: " + tm.getCurrentThreadUserTime());
//当前编译器情况
sb.append("\n=================================当前编译器情况============================= ");
CompilationMXBean gm = ManagementFactoryHelper.getCompilationMXBean();
sb.append("\nname: " + gm.getName());
sb.append("\ntotalCompilationTime: " + gm.getTotalCompilationTime());
//获取多个内存池的使用情况
sb.append("\n=========================获取多个内存池的使用情况============================ ");
List<MemoryPoolMXBean> mpmList = ManagementFactoryHelper.getMemoryPoolMXBeans();
for (MemoryPoolMXBean mpm : mpmList) {
sb.append("\nusage: " + mpm.getUsage());
sb.append("\nmemoryManagerNames: " + mpm.getMemoryManagerNames().toString());
}
//获取GC的次数以及花费时间之类的信息
sb.append("\n=====================获取GC的次数以及花费时间之类的信息======================== ");
List<GarbageCollectorMXBean> gcmList = ManagementFactoryHelper.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean gcm : gcmList) {
sb.append("\nname: " + gcm.getName());
sb.append("\nmemoryPoolNames: " + gcm.getMemoryPoolNames());
}
//获取运行时信息
sb.append("\n=============================获取运行时信息================================== ");
RuntimeMXBean rmb = ManagementFactoryHelper.getRuntimeMXBean();
sb.append("\nclassPath: " + rmb.getClassPath());
sb.append("\nlibraryPath: " + rmb.getLibraryPath());
sb.append("\nvmVersion: " + rmb.getVmVersion());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
log.info("当前时间{}, 系统信息如下:{}", dateFormat.format(new Date()), sb.toString());
}
@Override
public String scheduleId() {
return "system.monitor";
}
@Override
public String groupId() {
return "system";
}
}