You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SpringBoot中记录系统内存使用情况与线程数量?

Spring Boot 实现内存与线程指标日志记录方案

核心实现基于JDK自带的java.lang.management监控API,不需要引入复杂第三方依赖,即可完成要求的三个核心指标采集,同时支持内存转储能力扩展。


方案1:自定义定时采集(零额外依赖,灵活度最高)

直接通过JDK内置的MXBean采集JVM运行数据,通过定时任务定期打印日志,适合绝大多数场景。

  1. 首先在项目中开启定时任务支持,在配置类或者启动类上添加@EnableScheduling注解即可。
  2. 编写指标采集与日志打印逻辑,代码可直接复用:
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做服务监控,不需要自己写采集逻辑:

  1. 引入Actuator依赖后,在配置文件中开启指标端点暴露:
management:
  endpoints:
    web:
      exposure:
        include: metrics,health
  metrics:
    tags:
      application: ${spring.application.name}
  1. 直接复用内置指标:
  • 当前打开的线程数对应指标:jvm.threads.live
  • 已使用内存对应指标:jvm.memory.used
  • 已分配内存对应指标:jvm.memory.committed
    可以通过配置Micrometer日志推送规则,定期把这些指标输出到日志文件,也可以直接对接监控系统做可视化看板。

内容的提问来源于stack exchange,提问作者RYX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:01:21