当前位置:   article > 正文

java读取系统和硬件信息_getsystemcpuloadbetweenticks

getsystemcpuloadbetweenticks

公司为了方便运维人员部署项目,单独搞了个java的部署以及监控服务器状态的小工具

其中用到了一个三方库,可以读取到系统以及硬件信息(支持各种系统,我在linux和windows都试了是可以的)

了解了下源码就是通过JNA去读取系统信息的

下面是工具中用到的一些方法:

首先引包,一开始引的包在win7可以工作在win10有些接口有问题,然后自己单独引了最新的jna的包

  1. <dependency>
  2. <groupId>com.github.oshi</groupId>
  3. <artifactId>oshi-core</artifactId>
  4. <version>5.3.6</version>
  5. <exclusions>
  6. <exclusion>
  7. <artifactId>jna</artifactId>
  8. <groupId>net.java.dev.jna</groupId>
  9. </exclusion>
  10. <exclusion>
  11. <artifactId>jna-platform</artifactId>
  12. <groupId>net.java.dev.jna</groupId>
  13. </exclusion>
  14. </exclusions>
  15. </dependency>
  16. <dependency>
  17. <groupId>net.java.dev.jna</groupId>
  18. <artifactId>jna</artifactId>
  19. <version>5.5.0</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>net.java.dev.jna</groupId>
  23. <artifactId>jna-platform</artifactId>
  24. <version>5.5.0</version>
  25. <exclusions>
  26. <exclusion>
  27. <artifactId>jna</artifactId>
  28. <groupId>net.java.dev.jna</groupId>
  29. </exclusion>
  30. </exclusions>
  31. </dependency>

一:读取内存和cpu信息,通过比较内存信息比较准确,cpu有时和任务管理器的优点差异,但差异不会很大

  1. private static SystemInfo si;
  2. @Scheduled(fixedDelay = 25000)
  3. public void collectMetrics() throws CreatingSettingsFolderException, ReadingEcosystemException {
  4. log.info("Collecting Memory Dashboard Information");
  5. if (si == null){
  6. si = new SystemInfo();
  7. }
  8. HardwareAbstractionLayer hal = si.getHardware();
  9. GlobalMemory memory = hal.getMemory();
  10. MemoryUsageDto memoryUsageDto = new MemoryUsageDto();
  11. Date date = new Date();
  12. memoryUsageDto.setDate(new SimpleDateFormat("HH:mm:ss").format(date));
  13. memoryUsageDto.setFreeMemory(String.valueOf(memory.getAvailable() / (1024 * 1024)));
  14. memoryUsageDto.setTotalMemory(String.valueOf(memory.getTotal() / (1024 * 1024)));
  15. memoryUsageDto.setCpuUsed(cpuUsed(hal));
  16. memoryUsageQueue.add(memoryUsageDto);
  17. //加到文件中,用于记录历史记录
  18. MemoryUsageDto saveDto = new MemoryUsageDto();
  19. BeanUtils.copyProperties(memoryUsageDto,saveDto);
  20. saveDto.setDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));
  21. fileManager.saveSysInfo(saveDto);
  22. }
  23. private String cpuUsed(HardwareAbstractionLayer hal){
  24. //SystemInfo systemInfo = new SystemInfo();
  25. CentralProcessor processor = hal.getProcessor();
  26. long[] prevTicks = processor.getSystemCpuLoadTicks();
  27. Util.sleep(5000);
  28. long[] ticks = processor.getSystemCpuLoadTicks();
  29. long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
  30. long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
  31. long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
  32. long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
  33. long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
  34. long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
  35. long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
  36. long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
  37. long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
  38. return new DecimalFormat("#.#").format((totalCpu == 0L ?0:1.0-(idle * 1.0 / totalCpu))*100);
  39. }

界面展示

二、获取进程和磁盘信息

  1. /**
  2. * 获取进程信息
  3. * @return
  4. */
  5. public ProcessInfo[] parseProcesses(String order) {
  6. if (si == null){
  7. si = new SystemInfo();
  8. }
  9. OperatingSystem os = si.getOperatingSystem();
  10. List<OSProcess> list = os.getProcesses(0, null);
  11. long totalMem = si.getHardware().getMemory().getTotal();
  12. //int cpuCount = si.getHardware().getProcessor().getLogicalProcessorCount();
  13. // Build a map with a value for each process to control the sort
  14. Map<OSProcess, Double> processSortValueMap = new HashMap<>();
  15. for (OSProcess p : list) {
  16. int pid = p.getProcessID();
  17. // Ignore the Idle process on Windows
  18. if (pid > 0 || !SystemInfo.getCurrentPlatformEnum().equals(PlatformEnum.WINDOWS)) {
  19. // Set up for appropriate sort
  20. if ("cpu".equals(order)) {
  21. processSortValueMap.put(p, p.getProcessCpuLoadBetweenTicks(priorSnapshotMap.get(pid)));
  22. // } else if (cumulativeCpuButton.isSelected()) {
  23. // processSortValueMap.put(p, p.getProcessCpuLoadCumulative());
  24. } else {
  25. processSortValueMap.put(p, (double) p.getResidentSetSize());
  26. }
  27. }
  28. }
  29. // Now sort the list by the values
  30. List<Map.Entry<OSProcess, Double>> procList = new ArrayList<>(processSortValueMap.entrySet());
  31. procList.sort(Map.Entry.comparingByValue());
  32. // Insert into array in reverse order (lowest sort value last)
  33. int i = procList.size();
  34. ProcessInfo[] procArr = new ProcessInfo[i];
  35. // These are in descending CPU order
  36. for (Map.Entry<OSProcess, Double> e : procList) {
  37. OSProcess p = e.getKey();
  38. // Matches order of COLUMNS field
  39. i--;
  40. int pid = p.getProcessID();
  41. ProcessInfo info = new ProcessInfo();
  42. info.setPid(pid);
  43. info.setPpid(p.getParentProcessID());
  44. info.setThreads(p.getThreadCount());
  45. info.setCpuPercent(String.format("%.1f",
  46. 100d * p.getProcessCpuLoadBetweenTicks(priorSnapshotMap.get(pid))));
  47. //procArr[i][4] = String.format("%.1f", 100d * p.getProcessCpuLoadCumulative());
  48. //procArr[i][5] = FormatUtil.formatBytes(p.getVirtualSize());
  49. info.setMemory(FormatUtil.formatBytes(p.getResidentSetSize()));
  50. info.setMemoryPercent(String.format("%.1f", 100d * p.getResidentSetSize() / totalMem));
  51. info.setName(p.getName());
  52. procArr[i] = info;
  53. }
  54. // Re-populate snapshot map
  55. priorSnapshotMap.clear();
  56. for (OSProcess p : list) {
  57. priorSnapshotMap.put(p.getProcessID(), p);
  58. }
  59. return procArr;
  60. }
  61. public List<DiskInfo> fileInfo() {
  62. if (si == null){
  63. si = new SystemInfo();
  64. }
  65. FileSystem fileSystem = si.getOperatingSystem().getFileSystem();
  66. List<OSFileStore> fsArray = fileSystem.getFileStores();
  67. List<DiskInfo> diskInfos = new ArrayList<>();
  68. for (OSFileStore fs : fsArray) {
  69. long usable = fs.getUsableSpace();
  70. long total = fs.getTotalSpace();
  71. DiskInfo diskInfo = new DiskInfo();
  72. diskInfo.setName(fs.getName());
  73. diskInfo.setType(fs.getType());
  74. String used = String.format("%s(%.1f%%)",FormatUtil.formatBytes(usable), 100d * usable / total);
  75. diskInfo.setFree(used);
  76. diskInfo.setTotal(FormatUtil.formatBytes(fs.getTotalSpace()));
  77. diskInfos.add(diskInfo);
  78. }
  79. return diskInfos;
  80. }

界面展示

 

还有很多接口使用方法作者都给了例子和demo

https://github.com/oshi/oshi

这里也把基本使用给展示了

https://www.cnblogs.com/songxingzhu/p/9107878.html

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/58922
推荐阅读
相关标签
  

闽ICP备14008679号