如何在SpringBoot中记录系统内存使用情况与线程数量?
Spring Boot 实现内存与线程指标日志记录方案
核心实现基于JDK自带的java.lang.management监控API,不需要引入复杂第三方依赖,即可完成要求的三个核心指标采集,同时支持内存转储能力扩展。
方案1:自定义定时采集(零额外依赖,灵活度最高)
直接通过JDK内置的MXBean采集JVM运行数据,通过定时任务定期打印日志,适合绝大多数场景。
- 首先在项目中开启定时任务支持,在配置类或者启动类上添加
@EnableScheduling注解即可。 - 编写指标采集与日志打印逻辑,代码可直接复用:
import com.sun.management.HotSpotDiagnosticMXBean; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.Scheduled; import java.lang.management.ManagementFactory; import java.lang.management.MemoryUsage; import java.lang.management.ThreadMXBean; @Slf4j @Configuration public class JvmMetricsLogger { // 采集频率可按需调整,示例为每60秒打印一次日志 @Scheduled(fixedRate = 60000) public void printJvmMetrics() { // 采集活跃线程数(即当前打开的线程总数量) ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); int activeThreadCount = threadMXBean.getThreadCount(); // 采集堆内存指标 MemoryUsage heapMemory = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); long usedMemoryMb = heapMemory.getUsed() / 1024 / 1024; long committedMemoryMb = heapMemory.getCommitted() / 1024 / 1024; // JVM已向系统申请分配的内存容量 long maxMemoryMb = heapMemory.getMax() / 1024 / 1024; log.info("JVM运行监控 ===> 活跃线程数: {} | 已使用内存: {}MB | 已分配内存: {}MB | 最大堆内存上限: {}MB", activeThreadCount, usedMemoryMb, committedMemoryMb, maxMemoryMb); // 可选:内存阈值触发自动堆转储 double memoryUsedRate = (double) heapMemory.getUsed() / heapMemory.getCommitted(); if (memoryUsedRate > 0.85) { // 示例阈值:内存使用率超过85%时自动生成dump文件 log.warn("堆内存使用率超过阈值,即将生成堆转储文件"); try { HotSpotDiagnosticMXBean diagnosticBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class); String dumpPath = String.format("./heap-dump-%d.hprof", System.currentTimeMillis()); // 第二个参数true表示只dump存活对象,减小dump文件体积 diagnosticBean.dumpHeap(dumpPath, true); log.warn("堆转储文件已生成,路径:{}", dumpPath); } catch (Exception e) { log.error("生成堆转储文件失败", e); } } } }
注意:上面用到的
HotSpotDiagnosticMXBean是OpenJDK/OracleJDK内置的类,不需要额外引入依赖,生产环境使用建议给堆转储逻辑加冷却时间(比如10分钟内最多触发一次),避免高负载下反复生成dump占满磁盘。
方案2:基于Spring Boot Actuator实现(适合已有监控体系的项目)
如果项目已经集成了Actuator做服务监控,不需要自己写采集逻辑:
- 引入Actuator依赖后,在配置文件中开启指标端点暴露:
management: endpoints: web: exposure: include: metrics,health metrics: tags: application: ${spring.application.name}
- 直接复用内置指标:
- 当前打开的线程数对应指标:
jvm.threads.live - 已使用内存对应指标:
jvm.memory.used - 已分配内存对应指标:
jvm.memory.committed
可以通过配置Micrometer日志推送规则,定期把这些指标输出到日志文件,也可以直接对接监控系统做可视化看板。
内容的提问来源于stack exchange,提问作者RYX
相关产品推荐
相关产品推荐

