前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot 应用监控: Java获取 CPU,内存, JVM 内部运行状况代码

Spring Boot 应用监控: Java获取 CPU,内存, JVM 内部运行状况代码

作者头像
一个会写诗的程序员
发布2021-12-16 11:29:42
5.8K0
发布2021-12-16 11:29:42
举报
代码语言:javascript
复制
 package com.bytedance.kunlun.system;
 import com.google.common.collect.Maps;
 import com.sun.management.OperatingSystemMXBean;
 import org.springframework.stereotype.Component;
 import oshi.SystemInfo;
 import oshi.hardware.CentralProcessor;
 import java.io.File;
 import java.lang.management.*;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 @Component
 public class KunlunSystemInfo {
 public Mapenv()throws UnknownHostException {
 Map result =Maps.newHashMap();
 Runtime r =Runtime.getRuntime();
 Properties props =System.getProperties();
 InetAddress addr;
 addr =InetAddress.getLocalHost();
 String ip =addr.getHostAddress();
 Mapmap =System.getenv();
 String userName =map.get("USERNAME");// 获取用户名
         String computerName =map.get("COMPUTERNAME");// 获取计算机名
         String userDomain =map.get("USERDOMAIN");// 获取计算机域名
         result.put("用户名",userName);
 result.put("计算机名",computerName);
 result.put("计算机域名",userDomain);
 result.put("本地ip地址",ip);
 result.put("本地主机名",addr.getHostName());
 result.put("JVM可以使用的总内存",r.totalMemory());
 result.put("JVM可以使用的剩余内存",r.freeMemory());
 result.put("JVM可以使用的处理器个数",r.availableProcessors());
 result.put("Java的运行环境版本 ",props.getProperty("java.version"));
 result.put("Java的运行环境供应商 ",props.getProperty("java.vendor"));
 result.put("Java供应商的URL ",props.getProperty("java.vendor.url"));
 result.put("Java的安装路径 ",props.getProperty("java.home"));
 result.put("Java的虚拟机规范版本 ",props.getProperty("java.vm.specification.version"));
 result.put("Java的虚拟机规范供应商 ",props.getProperty("java.vm.specification.vendor"));
 result.put("Java的虚拟机规范名称 ",props.getProperty("java.vm.specification.name"));
 result.put("Java的虚拟机实现版本 ",props.getProperty("java.vm.version"));
 result.put("Java的虚拟机实现供应商 ",props.getProperty("java.vm.vendor"));
 result.put("Java的虚拟机实现名称 ",props.getProperty("java.vm.name"));
 result.put("Java运行时环境规范版本 ",props.getProperty("java.specification.version"));
 result.put("Java运行时环境规范供应商 ",props.getProperty("java.specification.vender"));
 result.put("Java运行时环境规范名称 ",props.getProperty("java.specification.name"));
 result.put("Java的类格式版本号 ",props.getProperty("java.class.version"));
 result.put("Java的类路径 ",props.getProperty("java.class.path"));
 result.put("加载库时搜索的路径列表 ",props.getProperty("java.library.path"));
 result.put("默认的临时文件路径 ",props.getProperty("java.io.tmpdir"));
 result.put("一个或多个扩展目录的路径 ",props.getProperty("java.ext.dirs"));
 result.put("操作系统的名称 ",props.getProperty("os.name"));
 result.put("操作系统的构架 ",props.getProperty("os.arch"));
 result.put("操作系统的版本 ",props.getProperty("os.version"));
 result.put("文件分隔符 ",props.getProperty("file.separator"));
 result.put("路径分隔符 ",props.getProperty("path.separator"));
 result.put("行分隔符 ",props.getProperty("line.separator"));
 result.put("用户的账户名称 ",props.getProperty("user.name"));
 result.put("用户的主目录 ",props.getProperty("user.home"));
 result.put("用户的当前工作目录 ",props.getProperty("user.dir"));
 return result;
 }
 public Mapdisk() {
 Map result =Maps.newHashMap();
 // 磁盘使用情况
         File[]files =File.listRoots();
 for (File file :files) {
 String total =new DecimalFormat("#.#").format(file.getTotalSpace() *1.0 /1024 /1024 /1024) +"G";
 String free =new DecimalFormat("#.#").format(file.getFreeSpace() *1.0 /1024 /1024 /1024) +"G";
 String un =new DecimalFormat("#.#").format(file.getUsableSpace() *1.0 /1024 /1024 /1024) +"G";
 String path =file.getPath();
 Map pathMap =Maps.newHashMap();
 pathMap.put("总空间",total);
 pathMap.put("可用空间",un);
 pathMap.put("空闲空间",free);
 result.put(path,pathMap);
 }
 return result;
 }
 public Mapmem() {
 Map result =Maps.newHashMap();
 OperatingSystemMXBean osmxb = (OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
 MemoryMXBean memoryMXBean =ManagementFactory.getMemoryMXBean();
 // 堆内存使用情况
         MemoryUsage memoryUsage =memoryMXBean.getHeapMemoryUsage();
 // 初始的总内存
         long initTotalMemorySize =memoryUsage.getInit();
 // 最大可用内存
         long maxMemorySize =memoryUsage.getMax();
 // 已使用的内存
         long usedMemorySize =memoryUsage.getUsed();
 Map memoryUsageMap =Maps.newHashMap();
 memoryUsageMap.put("初始的总内存",initTotalMemorySize);
 memoryUsageMap.put("最大可用内存",maxMemorySize);
 memoryUsageMap.put("已使用的内存",usedMemorySize);
 // 总的物理内存
         String totalMemorySize =new DecimalFormat("#.##").format(osmxb.getTotalPhysicalMemorySize() /1024.0 /1024 /1024) +"G";
 // 剩余的物理内存
         String freePhysicalMemorySize =new DecimalFormat("#.##").format(osmxb.getFreePhysicalMemorySize() /1024.0 /1024 /1024) +"G";
 // 已使用的物理内存
         String usedMemory =new DecimalFormat("#.##").format((osmxb.getTotalPhysicalMemorySize() -osmxb.getFreePhysicalMemorySize()) /1024.0 /1024 /1024) +"G";
 memoryUsageMap.put("总的物理内存",totalMemorySize);
 memoryUsageMap.put("剩余的物理内存",freePhysicalMemorySize);
 memoryUsageMap.put("已使用的物理内存",usedMemory);
 String jvmInitMem =new DecimalFormat("#.#").format(initTotalMemorySize *1.0 /1024 /1024) +"M";
 String jvmMaxMem =new DecimalFormat("#.#").format(maxMemorySize *1.0 /1024 /1024) +"M";
 String jvmUsedMem =new DecimalFormat("#.#").format(usedMemorySize *1.0 /1024 /1024) +"M";
 memoryUsageMap.put("JVM初始总内存",jvmInitMem);
 memoryUsageMap.put("JVM最大可用内存",jvmMaxMem);
 memoryUsageMap.put("JVM已使用的内存",jvmUsedMem);
 result.put("系统内存使用情况",memoryUsageMap);
 return result;
 }
 public Mapcpu() {
 Map result =Maps.newHashMap();
 SystemInfo systemInfo =new SystemInfo();
 result.put("程序启动时间",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(ManagementFactory.getRuntimeMXBean().getStartTime())));
 result.put("程序更新时间",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(ManagementFactory.getRuntimeMXBean().getUptime())));
 CentralProcessor processor =systemInfo.getHardware().getProcessor();
 long[]prevTicks =processor.getSystemCpuLoadTicks();
 long[]ticks =processor.getSystemCpuLoadTicks();
 long nice =ticks[CentralProcessor.TickType.NICE.getIndex()]
 -prevTicks[CentralProcessor.TickType.NICE.getIndex()];
 long irq =ticks[CentralProcessor.TickType.IRQ.getIndex()]
 -prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
 long softirq =ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()]
 -prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
 long steal =ticks[CentralProcessor.TickType.STEAL.getIndex()]
 -prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
 long cSys =ticks[CentralProcessor.TickType.SYSTEM.getIndex()]
 -prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
 long user =ticks[CentralProcessor.TickType.USER.getIndex()]
 -prevTicks[CentralProcessor.TickType.USER.getIndex()];
 long iowait =ticks[CentralProcessor.TickType.IOWAIT.getIndex()]
 -prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
 long idle =ticks[CentralProcessor.TickType.IDLE.getIndex()]
 -prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
 long totalCpu =user +nice +cSys +idle +iowait +irq +softirq +steal;
 result.put("cpu核数",processor.getLogicalProcessorCount());
 result.put("cpu系统使用率",new DecimalFormat("#.##%").format(cSys *1.0 /totalCpu));
 result.put("cpu用户使用率",new DecimalFormat("#.##%").format(user *1.0 /totalCpu));
 result.put("cpu当前等待率",new DecimalFormat("#.##%").format(iowait *1.0 /totalCpu));
 result.put("cpu当前空闲率",new DecimalFormat("#.##%").format(idle *1.0 /totalCpu));
 return result;
 }
 public Mapjvm() {
 Map result =Maps.newHashMap();
 // 获得线程总数
         ThreadGroup parentThread;
 for (parentThread =Thread.currentThread().getThreadGroup();
 parentThread.getParent() !=null;
 parentThread = parentThread.getParent()) {
 }
 int totalThread = parentThread.activeCount();
 result.put("总线程数",totalThread);
 result.put("PID",System.getProperty("PID"));
 result.put("LibraryPath",ManagementFactory.getRuntimeMXBean().getLibraryPath());
 result.put("BootClassPath",ManagementFactory.getRuntimeMXBean().getBootClassPath());
 result.put("ClassPath",ManagementFactory.getRuntimeMXBean().getClassPath());
 result.put("ObjectPendingFinalizationCount",ManagementFactory.getMemoryMXBean().getObjectPendingFinalizationCount());
 result.put("HeapMemoryUsage",ManagementFactory.getMemoryMXBean().getHeapMemoryUsage());
 result.put("NonHeapMemoryUsage",ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage());
 result.put("ObjectName",ManagementFactory.getMemoryMXBean().getObjectName());
 result.put("LoadedClassCount",ManagementFactory.getClassLoadingMXBean().getLoadedClassCount());
 result.put("TotalLoadedClassCount",ManagementFactory.getClassLoadingMXBean().getTotalLoadedClassCount());
 result.put("TotalCompilationTime",ManagementFactory.getCompilationMXBean().getTotalCompilationTime());
 result.put("Compilation",ManagementFactory.getCompilationMXBean().getName());
 result.put("OperatingSystemMXBean",ManagementFactory.getOperatingSystemMXBean().getName());
 result.put("OperatingSystemMXArch",ManagementFactory.getOperatingSystemMXBean().getArch());
 result.put("AvailableProcessors",ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors());
 result.put("SystemLoadAverage",ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage());
 Map jvmMemPool =Maps.newHashMap();
 //内存池对象
         Listpools =ManagementFactory.getMemoryPoolMXBeans();
 for (MemoryPoolMXBean pool :pools) {
 jvmMemPool.put(pool.getName(),new HashMap() {
 {
 put("name",pool.getName());
 put("Type",pool.getType());
 put("ObjectName",pool.getObjectName());
 put("Usage",pool.getUsage().toString());
 put("PeakUsage",pool.getPeakUsage());
 put("CollectionUsage",pool.getCollectionUsage());
 }
 });
 }
 result.put("MemoryPool",jvmMemPool);
 Map garbageCollector =Maps.newHashMap();
 // gc
         Listgcs =ManagementFactory.getGarbageCollectorMXBeans();
 // ParallelOld("ParallelOld"),
 //    SerialOld("SerialOld"),
 //    PSMarkSweep("PSMarkSweep"),
 //    ParallelScavenge("ParallelScavenge"),
 //    DefNew("DefNew"),
 //    ParNew("ParNew"),
 //    G1New("G1New"),
 //    ConcurrentMarkSweep("ConcurrentMarkSweep"),
 //    G1Old("G1Old"),
 //    GCNameEndSentinel("GCNameEndSentinel");
         for (GarbageCollectorMXBean gc :gcs) {
 garbageCollector.put(gc.getName(),gc);
 }
 result.put("GarbageCollector",garbageCollector);
 return result;
 }
 }
 

依赖jar包

代码语言:javascript
复制
 <!-- https://mvnrepository.com/artifact/com.github.oshi/oshi-core -->
 <dependency>
     <groupId>com.github.oshi</groupId>
     <artifactId>oshi-core</artifactId>
     <version>5.8.0</version>
 </dependency>
 <dependency>
     <groupId>net.java.dev.jna</groupId>
     <artifactId>jna</artifactId>
     <version>5.8.0</version>
 </dependency>
 <dependency>
     <groupId>net.java.dev.jna</groupId>
     <artifactId>jna-platform</artifactId>
     <version>5.8.0</version>
 </dependency>
 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/8/14 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档