1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
| @Component public class MemoryMonitor { private ScheduledExecutorService scheduler; @PostConstruct public void init() { scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(this::monitorMemory, 0, 5, TimeUnit.SECONDS); }
public void monitorMemory() { MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean(); Runtime runtime = Runtime.getRuntime(); MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage(); double heapUsagePercent = (double) heapUsage.getUsed() / heapUsage.getMax() * 100; MemoryUsage nonHeapUsage = memoryBean.getNonHeapMemoryUsage(); List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans(); recordMetrics(heapUsage, nonHeapUsage, pools, heapUsagePercent); checkMemoryAlerts(heapUsagePercent, heapUsage); }
private void recordMetrics(MemoryUsage heapUsage, MemoryUsage nonHeapUsage, List<MemoryPoolMXBean> pools, double heapUsagePercent) { recordMetric("jvm.memory.heap.used", heapUsage.getUsed()); recordMetric("jvm.memory.heap.max", heapUsage.getMax()); recordMetric("jvm.memory.heap.used.percent", heapUsagePercent); recordMetric("jvm.memory.nonheap.used", nonHeapUsage.getUsed()); recordMetric("jvm.memory.nonheap.max", nonHeapUsage.getMax()); for (MemoryPoolMXBean pool : pools) { String poolName = pool.getName(); MemoryUsage usage = pool.getUsage(); recordMetric("jvm.memory.pool.used", usage.getUsed(), "pool", poolName); recordMetric("jvm.memory.pool.max", usage.getMax(), "pool", poolName); } }
private void checkMemoryAlerts(double heapUsagePercent, MemoryUsage heapUsage) { if (heapUsagePercent > 90) { sendAlert("CRITICAL", String.format("堆内存使用率过高: %.2f%%", heapUsagePercent)); } else if (heapUsagePercent > 80) { sendAlert("WARNING", String.format("堆内存使用率较高: %.2f%%", heapUsagePercent)); } long availableMemory = heapUsage.getMax() - heapUsage.getUsed(); long availableMB = availableMemory / (1024 * 1024); if (availableMB < 200) { sendAlert("WARNING", String.format("可用堆内存不足: %d MB", availableMB)); } } private void recordMetric(String name, long value, String... tags) { } private void sendAlert(String level, String message) { log.warn("[{}] {}", level, message); }
public MemoryReport getMemoryReport() { MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean(); Runtime runtime = Runtime.getRuntime(); MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage(); MemoryUsage nonHeapUsage = memoryBean.getNonHeapMemoryUsage(); List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans(); List<PoolMemoryInfo> poolInfos = pools.stream() .map(pool -> { MemoryUsage usage = pool.getUsage(); return PoolMemoryInfo.builder() .name(pool.getName()) .type(pool.getType().toString()) .used(usage.getUsed()) .committed(usage.getCommitted()) .max(usage.getMax()) .usagePercent(usage.getMax() > 0 ? (double) usage.getUsed() / usage.getMax() * 100 : 0) .build(); }) .collect(Collectors.toList()); return MemoryReport.builder() .heapUsed(heapUsage.getUsed()) .heapMax(heapUsage.getMax()) .heapUsagePercent((double) heapUsage.getUsed() / heapUsage.getMax() * 100) .nonHeapUsed(nonHeapUsage.getUsed()) .nonHeapMax(nonHeapUsage.getMax()) .pools(poolInfos) .timestamp(System.currentTimeMillis()) .build(); } }
@Data @Builder class MemoryReport { private long heapUsed; private long heapMax; private double heapUsagePercent; private long nonHeapUsed; private long nonHeapMax; private List<PoolMemoryInfo> pools; private long timestamp; }
@Data @Builder class PoolMemoryInfo { private String name; private String type; private long used; private long committed; private long max; private double usagePercent; }
|