在 Spring Boot 中实现 JVM 在线监控(包括线程曲线、内存使用、GC 情况等),最常用的方案是结合 Spring Boot Actuator + Micrometer + 监控可视化工具(如 Grafana、Prometheus)。以下是完整实现方案:
一、核心依赖与配置
1. 添加 Maven 依赖
xml
<!-- Spring Boot Actuator:提供监控端点 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency><!-- Micrometer: metrics 收集工具,适配多种监控系统 -->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId>
</dependency><!-- 可选:如果需要简单的可视化界面,可添加 spring-boot-admin -->
<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>3.2.1</version> <!-- 与 Spring Boot 版本匹配 -->
</dependency>
2. 配置 application.yml
yaml
# 暴露监控端点
management:endpoints:web:exposure:include: health,info,prometheus,metrics,threaddump,heapdump # 暴露的端点metrics:export:prometheus:enabled: true # 启用 Prometheus 导出endpoint:health:show-details: always # 显示健康详情threaddump:enabled: true # 启用线程 dump 端点heapdump:enabled: true # 启用堆 dump 端点# 可选:Spring Boot Admin 配置(如果使用)
spring:boot:admin:client:url: http://localhost:8080 # Spring Boot Admin 服务端地址application:name: jvm-monitor-demo # 应用名称,用于监控面板识别
二、关键监控端点说明
通过 Actuator 暴露的端点,可以直接获取监控数据:
/actuator/prometheus
:以 Prometheus 格式暴露 metrics 数据(供可视化工具抓取)/actuator/metrics
:查看所有可监控的指标(如jvm.threads.live
、jvm.memory.used
)/actuator/metrics/jvm.threads.live
:查看当前活跃线程数/actuator/threaddump
:获取线程 dump 信息(用于排查线程阻塞)/actuator/heapdump
:下载堆 dump 文件(用于分析内存泄漏)
三、可视化监控方案
方案 1:Prometheus + Grafana(推荐)
1. 部署 Prometheus
- 下载 Prometheus 并配置
prometheus.yml
:yaml
scrape_configs:- job_name: 'spring-boot-app'metrics_path: '/actuator/prometheus'scrape_interval: 5s # 每 5 秒抓取一次static_configs:- targets: ['localhost:8080'] # 你的 Spring Boot 应用地址
- 启动 Prometheus:
./prometheus --config.file=prometheus.yml
2. 部署 Grafana 并配置面板
- 下载并启动 Grafana,访问
http://localhost:3000
(默认账号 admin/admin) - 添加 Prometheus 数据源(URL:
http://localhost:9090
) - 导入 JVM 监控面板:
- 访问 Grafana Dashboards,搜索
JVM Micrometer
(推荐 ID:4701) - 导入面板后即可看到:
- 线程数曲线(活跃线程、守护线程、峰值线程)
- 内存使用曲线(堆内存、非堆内存、各代内存)
- GC 次数与耗时曲线
- 类加载统计等
- 访问 Grafana Dashboards,搜索
方案 2:Spring Boot Admin(轻量级可视化)
1. 部署 Spring Boot Admin 服务端
创建一个单独的 Spring Boot 应用作为 Admin 服务端:
xml
<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>3.2.1</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
启动类添加注解:
java
运行
@SpringBootApplication
@EnableAdminServer
public class AdminServerApplication {public static void main(String[] args) {SpringApplication.run(AdminServerApplication.class, args);}
}
2. 查看监控面板
访问 Admin 服务端地址(http://localhost:8080
),可看到:
- 应用概览(健康状态、内存使用)
- 详细监控页:
- 线程标签页:线程数趋势图、线程状态分布
- JVM 标签页:内存、GC、类加载监控
- 环境标签页:系统属性、配置信息
四、自定义监控指标(可选)
如果需要监控业务指标(如自定义线程池状态),可通过 Micrometer 手动埋点:
java
运行
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class CustomMetrics {private final MeterRegistry meterRegistry;private Counter taskCounter;public CustomMetrics(MeterRegistry meterRegistry) {this.meterRegistry = meterRegistry;}@PostConstructpublic void init() {// 初始化一个任务计数器taskCounter = meterRegistry.counter("custom.task.executed");// 监控自定义线程池状态ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.initialize();meterRegistry.gauge("custom.threadpool.active", executor, ThreadPoolTaskExecutor::getActiveCount);}// 业务中调用此方法计数public void incrementTaskCount() {taskCounter.increment();}
}
五、总结
- 轻量需求:使用
Spring Boot Admin
,快速搭建可视化监控,适合开发 / 测试环境。 - 生产环境:推荐
Prometheus + Grafana
,支持持久化存储、告警配置(如线程数过高时邮件通知)、多维度分析。 - 核心监控指标:线程数(
jvm.threads.live
)、内存使用(jvm.memory.used
)、GC 耗时(jvm.gc.pause
)、CPU 使用率(system.cpu.usage
)。
通过以上方案,可实现 JVM 与线程的实时监控和历史趋势分析,便于及时发现性能瓶颈。