SystemHealth.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package com.evps.common.utils;
  2. import com.sun.management.OperatingSystemMXBean;
  3. import lombok.Getter;
  4. import java.io.File;
  5. import java.lang.management.GarbageCollectorMXBean;
  6. import java.lang.management.ManagementFactory;
  7. import java.lang.management.MemoryMXBean;
  8. import java.time.Instant;
  9. import java.time.ZoneId;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. @Getter
  13. public class SystemHealth {
  14. private String osName = System.getProperty("os.name");
  15. private String osVersion = System.getProperty("os.version");
  16. private int cpuCores = Runtime.getRuntime().availableProcessors();
  17. private long maxMemory = Runtime.getRuntime().maxMemory();
  18. private long totalMemory = 0; // MB
  19. private long freeMemory = 0; // MB
  20. private long usedMemory = 0; // MB
  21. private long heapUsed;
  22. private long nonHeapUsed;
  23. private double memUsage = 0.;
  24. private double cpuUsage = 0.;
  25. private double loadAverage; // CPU 부하
  26. private int threadCount = 0; // 현재스레드 수
  27. private int peakThreadCount; // 어플리케이션 운영중 최대 스레드 수
  28. private long jvmUptime; // milliseconds, - 예: uptimeMillis = 3600000 → JVM이 1시간(60분) 동안 실행 중이라는 뜻
  29. private long loadedClassCount;
  30. // private final Map<String, Double> diskUsageMap = new HashMap<>();
  31. private long diskTotal;
  32. private long diskFree;
  33. private double diskUsage;
  34. private final Map<String, GcStats> gcStatsMap = new HashMap<>();
  35. private String gcName;
  36. private long gcCount = 0;
  37. private long gcTime = 0;
  38. private String jvmStartTime;
  39. public SystemHealth() {
  40. this.jvmStartTime = Instant.ofEpochMilli(
  41. ManagementFactory.getRuntimeMXBean().getStartTime()
  42. ).atZone(ZoneId.systemDefault()).toString();
  43. Runtime runtime = Runtime.getRuntime();
  44. this.maxMemory = runtime.maxMemory() / 1024 / 1024;
  45. this.cpuCores = runtime.availableProcessors();
  46. this.osName = System.getProperty("os.name");
  47. this.osVersion = System.getProperty("os.version");
  48. }
  49. public void checkHealth(boolean useDisk) {
  50. Runtime runtime = Runtime.getRuntime();
  51. this.totalMemory = runtime.totalMemory(); // Byte
  52. this.freeMemory = runtime.freeMemory(); // Byte
  53. this.usedMemory = this.totalMemory - this.freeMemory; // Byte
  54. MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
  55. this.heapUsed = memoryMXBean.getHeapMemoryUsage().getUsed() / 1024 / 1024;
  56. this.nonHeapUsed = memoryMXBean.getNonHeapMemoryUsage().getUsed() / 1024 / 1024;
  57. this.totalMemory = this.totalMemory / 1024 / 1024;
  58. this.freeMemory = this.freeMemory / 1024 / 1024;
  59. this.usedMemory = this.usedMemory / 1024 / 1024;
  60. // System.out.println("사용 중인 메모리: " + (usedMemory / 1024 / 1024) + " MB");
  61. // System.out.println("최대 메모리: " + (maxMemory / 1024 / 1024) + " MB");
  62. this.memUsage = (double) this.usedMemory / this.maxMemory * 100;
  63. // For Linux/Unix, Windows(Perhaps)
  64. OperatingSystemMXBean osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
  65. this.cpuUsage = osBean.getSystemCpuLoad() * 100;
  66. this.loadAverage = osBean.getSystemLoadAverage(); // 1분 평균
  67. this.threadCount = ManagementFactory.getThreadMXBean().getThreadCount();
  68. this.peakThreadCount = ManagementFactory.getThreadMXBean().getPeakThreadCount();
  69. this.jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
  70. // long uptimeSeconds = this.jvmUptime / 1000;
  71. // long uptimeMinutes = uptimeSeconds / 60;
  72. // long uptimeHours = uptimeMinutes / 60;
  73. // long uptimeDays = uptimeHours / 24;
  74. // System.out.println("JVM Uptime: "
  75. // + uptimeDays + "d "
  76. // + (uptimeHours % 24) + "h "
  77. // + (uptimeMinutes % 60) + "m "
  78. // + (uptimeSeconds % 60) + "s");
  79. this.loadedClassCount = ManagementFactory.getClassLoadingMXBean().getLoadedClassCount();
  80. if (useDisk) {
  81. File root = new File("/");
  82. if (root.exists() && root.canRead()) {
  83. this.diskTotal = root.getTotalSpace();
  84. this.diskFree = root.getFreeSpace();
  85. long used = this.diskTotal - this.diskFree;
  86. this.diskUsage = (double) used / this.diskTotal * 100;
  87. }
  88. }
  89. for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) {
  90. this.gcName = gc.getName();
  91. this.gcCount += gc.getCollectionCount();
  92. this.gcTime += gc.getCollectionTime();
  93. gcStatsMap.put(gc.getName(), new GcStats(gc.getCollectionCount(), gc.getCollectionTime()));
  94. }
  95. // for (File root : File.listRoots()) {
  96. // if (root.exists() && root.canRead()) {
  97. // long total = root.getTotalSpace();
  98. // long free = root.getFreeSpace();
  99. // double usage = (double) (total - free) / total * 100;
  100. // diskUsageMap.put(root.getAbsolutePath(), usage);
  101. // }
  102. // }
  103. // GC가 전체 실행 시간의 몇 %를 차지했는지 확인 가능
  104. // long uptime = ManagementFactory.getRuntimeMXBean().getUptime(); // ms
  105. // long gcTime = this.gcTime;
  106. // double gcRatio = (double) gcTime / uptime * 100;
  107. // log.info("GC Time: {}ms, JVM Uptime: {}ms, GC 비중: {:.2f}%", gcTime, uptime, gcRatio);
  108. }
  109. public String getFormattedUptime() {
  110. long uptimeSeconds = this.jvmUptime / 1000;
  111. long uptimeMinutes = uptimeSeconds / 60;
  112. long uptimeHours = uptimeMinutes / 60;
  113. long uptimeDays = uptimeHours / 24;
  114. return uptimeDays + "d " + (uptimeHours % 24) + "h " + (uptimeMinutes % 60) + "m " + (uptimeSeconds % 60) + "s";
  115. }
  116. }